HttpsURLConnection
Java 6 を使用しており、クライアント証明書を使用してリモート サーバーに対してを作成しようとしています。
サーバーは自己署名ルート証明書を使用しており、パスワードで保護されたクライアント証明書を提示する必要があります。サーバールート証明書とクライアント証明書を、/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
ここでクライアント証明書が問題であるかどうかさえわかりません。