クライアント認証用のキーツールを使用してキーペアを作成しました。このファイルから、サーバーがクライアントを認証するための証明書として公開鍵をエクスポートしました。
クライアントのセットアップ:
サーバー証明書をトラストストア ファイルにロードし、キーストア ファイルをキーストアとして使用しました。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 出力に証明書チェーンを提示していないことがわかります。
VM 引数:
-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