有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java:加载带有客户端证书的HTTPS url

我安装了pkcs12证书,可以在浏览器上加载url“httpsURL”

但我的独立java程序不能做到这一点

System.setProperty("javax.net.ssl.keyStore", "d:/keys2222/prince.p12");
System.setProperty("javax.net.ssl.keyStorePassword", "password");
URL url = new URL("httpsURL"); // URL is perfect
URLConnection con = url.openConnection(); // fails here

请帮帮我


共 (2) 个答案

  1. # 1 楼答案

    您获得java.security.cert.CertificateException: No name matching localhost found的原因是证书的CN与您访问服务器的URL的主机名不匹配。因此,您要么需要使用正确的CN创建一个证书,要么可以编写自己的HostNameVerifier来忽略这个问题。但是如果你这么做了,请确保在完成测试时删除该代码This document指定如何执行此操作:

    javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(
        new javax.net.ssl.HostnameVerifier(){
    
            public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) {
                if (hostname.equals("theHostname")) {
                    return true;
                }
                return false;
            }
        };
    );
    
  2. # 2 楼答案

    由于您使用的是自签名证书,JVM不信任它,因此httpsURL不起作用。 您需要使用keytool将其添加到JVM的密钥库中 看这个article

    编辑:抱歉,我忘了提到需要指定JVM默认密钥库cacerts。这个article将向您展示它是如何完成的

    还请注意,您的证书必须与URL完全匹配