問題は、クライアント側とサーバー側の SSL 構成です。SSL ハンドシェイクの問題は、Web サービスの構成とは関係ありません。Web サービスは HTTP を経由し、HttpsURLConnection
これを処理するのは Java です。
双方向 SSL ハンドシェイクには次のものが必要です。
クライアント側
- サーバー証明書はキーストアにある必要があります。または、Web サービス クライアントを使用する前に、説明に従ってこの設定を無効にすることもできます。
コード:
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {
}
} };
// Install the all-trusting trust manager
try {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
}
- サーバー証明書の「サーバー名」は、Web サービス エンドポイント ( ) へのアクセスに使用している URL と一致する必要があります。
checkURLSpoofing
または、サービス クライアントを使用する前に、この検証設定をオフにしてください。
コード:
// Create all-trusting host name verifier
HostnameVerifier allHostsValid = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
// Install the all-trusting host verifier
HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
- 証明書を正しく送信するようにクライアント側を構成します。Web サービス クライアントを使用する前にこれを設定します。
コード:
System.setProperty("javax.net.ssl.keyStore", "path/to/your/key");
System.setProperty("javax.net.ssl.keyStorePassword", "your-keystore-password");
System.setProperty("javax.net.ssl.keyStoreType", "JKS");
System.setProperty("javax.net.ssl.trustStore", "path/to/your/trust/keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "your-truststore-password");
System.setProperty("com.sun.net.ssl.dhKeyExchangeFix", "true");
サーバ側
- サーバーが使用する信頼ストアにクライアント証明書を追加します
問題が続く場合は、スタックトレース (クライアントとサーバー) を追加して、何が起こっているかを確認してください。