私はJava 6をHttpsURLConnection
使用しており、クライアント証明書を使用してリモートサーバーに対してを作成しようとしています。
サーバーは自己署名ルート証明書を使用しており、パスワードで保護されたクライアント証明書を提示する必要があります。サーバールート証明書とクライアント証明書を/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/security/cacerts
(OSX 10.5)で見つけたデフォルトのJavaキーストアに追加しました。キーストアファイルの名前は、クライアント証明書がそこに入るはずではないことを示唆しているようです?
とにかく、このストアにルート証明書を追加すると悪名高い問題が解決しました javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed' problem.
しかし、今はクライアント証明書の使い方にこだわっています。私は2つのアプローチを試しましたが、どちらも私をどこにも連れて行きません。
まず、お勧めします:
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
URL url = new URL("https://somehost.dk:3049");
HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
conn.setSSLSocketFactory(sslsocketfactory);
InputStream inputstream = conn.getInputStream();
// The last line fails, and gives:
// javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
私はHttpsURLConnectionクラスをスキップしようとしました(サーバーとHTTPをやり取りしたいので理想的ではありません)。代わりに次のようにします。
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("somehost.dk", 3049);
InputStream inputstream = sslsocket.getInputStream();
// do anything with the inputstream results in:
// java.net.SocketTimeoutException: Read timed out
ここでクライアント証明書が問題であるかどうかさえわかりません。