我已经使用 keytool 创建了一个用于客户端身份验证的密钥对。从这个文件中,我将公钥导出为服务器的证书以对客户端进行身份验证。
客户端设置:
将服务器证书加载到信任库文件中,并将密钥库文件用作密钥库。当我通过带有 SSLContext 的代码并使用 Apache HttpClient 加载信任库和密钥库时,客户端工作:
KeyStore keyStore = KeyStore.getInstance("JKS");
keyStore.load(new FileInputStream("keystore"), keyPassphrase.toCharArray());
SSLContext sslcontext = SSLContexts.custom()
.loadTrustMaterial(new File("truststore"), trustPassphrase.toCharArray(),
new TrustSelfSignedStrategy())
.loadKeyMaterial(keyStore,keyPassphrase.toCharArray())
.build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
sslcontext,
new String[] {"TLSv1"},
null,
SSLConnectionSocketFactory.getDefaultHostnameVerifier());
CloseableHttpClient httpclient = HttpClients.custom()
.setSSLSocketFactory(sslsf)
.build();
ssl 输出显示客户端提供证书链。使用 SoapUI 设置密钥库也可以正常工作。
我的问题:通过 vm-arguments 提供相同的信任库和密钥库(不使用 SSLContext)我看到客户端没有在 ssl 输出中显示证书链。
虚拟机参数:
-Djavax.net.debug=ssl
-Djavax.net.ssl.keyStoreType=JKS
-Djavax.net.ssl.keyStore=keystore
-Djavax.net.ssl.keyStorePassword=keystorepw
-Djavax.net.ssl.trustStoreType=jks
-Djavax.net.ssl.trustStore=truststore
-Djavax.net.ssl.trustStorePassword=truststorepw