我将此问题归结为一个证书提供者,该证书提供者不为的默认JVM受信任主机的一部分JDK 8u74
。提供者是www.identrust.com,但这不是我尝试连接的域。该域已从该提供者那里获得了证书。请参阅JDK / JRE中的默认列表是否可以跨交叉根目录覆盖信任?-阅读一些条目。另请参见哪些浏览器和操作系统支持“让我们加密”。
因此,为了连接到我感兴趣的域,该域具有我发出的证书,请identrust.com
执行以下步骤。基本上,我必须获得identrust.com(DST Root CA X3
)证书才能被JVM信任。我能够使用Apache HttpComponents 4.5做到这一点,如下所示:
1:从证书链下载说明中的 indettrust获取证书。单击DST根CA X3链接。
2:将字符串保存到名为“ DST Root CA X3.pem”的文件中。确保在文件的开头和结尾添加“ ----- BEGIN CERTIFICATE -----”和“ ----- END CERTIFICATE -----”行。
3:使用以下命令创建一个Java密钥库文件cacerts.jks:
keytool -import -v -trustcacerts -alias IdenTrust -keypass yourpassword -file dst_root_ca_x3.pem -keystore cacerts.jks -storepass yourpassword
4:将生成的cacerts.jks密钥库复制到Java /(Maven)应用程序的resources目录中。
5:使用以下代码加载该文件并将其附加到Apache 4.5 HttpClient。这将解决所有具有从indetrust.com
util oracle 颁发的证书并将证书包含在JRE默认密钥库中的域的问题。
SSLContext sslcontext = SSLContexts.custom()
.loadTrustMaterial(new File(CalRestClient.class.getResource("/cacerts.jks").getFile()), "yourpasword".toCharArray(),
new TrustSelfSignedStrategy())
.build();
// Allow TLSv1 protocol only
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
sslcontext,
new String[] { "TLSv1" },
null,
SSLConnectionSocketFactory.getDefaultHostnameVerifier());
CloseableHttpClient httpclient = HttpClients.custom()
.setSSLSocketFactory(sslsf)
.build();
当项目建立时,cacerts.jks将被复制到类路径并从那里加载。目前,我尚未针对其他ssl网站进行测试,但是如果此证书中的上述代码“链”也可以工作,但是我仍然不知道。
参考:自定义SSL上下文,以及如何使用Java HttpsURLConnection接受自签名证书?