自己署名証明書を受け入れる必要がある jax-ws クライアント アプリを作成しています。しかし、自己署名証明書をインポートしようとすると、この一般的なSSL ハンドシェイク例外の問題が発生します。そのため、最も一般的な回避策は、JSSE セキュリティ プロバイダを拡張し、SSL コンテキストを初期化して、次のようなすべての証明書を受け入れることです。
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
TrustManager[] trustCerts = new TrustManager[]{new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkServerTrusted(X509Certificate[]
certs, String authType) throws CertificateException {
return;
}
public void checkClientTrusted(X509Certificate[]
certs, String authType) throws CertificateException {
return;
}
}
};
SSLContext sc = SSLContext.getInstance("SSLv3");
sc.init(null, trustCerts, null);
SocketFactory factory = sc.getSocketFactory();
SSLSocket socket;
socket = (SSLSocket) factory.createSocket(mInstance.getHostName(),getSecureConnectionEndpoint().getPort());
socket.startHandshake();
setCerts(socket.getSession().getPeerCertificates());
これが、この問題に対して私が見つけた唯一の回避策でした。ここには、 SSL 証明書のインポートなど、同様の種類の質問が多数あり、それらはすべて同じ解決策を提案しています。
これは明らかに中間者攻撃を非常に受けやすく、このソリューションはテスト目的でのみ正当であるように思われます。
私の質問は、証明書をプログラムでインポートしようとするときに、このプロセス全体をより安全にする方法はありませんか?
前もって感謝します!