SSLを使用してHAProxyサーバーに接続するとランダムに表示される接続エラーが発生します。これらの障害はJDKバージョン1.7.0_21および1.7.0_25では発生しますが、1.7.0_04または1.6.0_38では発生しないことが確認されています。
の例外は、デフォルトのコンテキストでTLSのSSLコンテキストを使用していない場合、これらの障害にのみ起こる
Exception in thread "main" javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
at sun.security.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:397)
at SSLTest2.main(SSLTest2.java:52)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
です。次のコードは、ループが完了する前に(接続の約2%が失敗)千回と障害が起こるループ内で実行されます、しかし、私はこの方法をSSLコンテキストを作成した場合
SSLContext sslcontext = SSLContext.getInstance("TLS");
sslcontext.init(null, null, null);
SSLSocketFactory factory = sslcontext.getSocketFactory();
SSLSocket socket = (SSLSocket)factory.createSocket("myserver", 443);
//socket.startHandshake();
SSLSession session = socket.getSession();
session.getPeerCertificates();
socket.close();
私は、接続されていません私が言及したのJavaのバージョンのいずれかの障害:
SSLSocketFactory factory = (SSLSocketFactory)SSLSocketFactory.getDefault();
最初の方法は、SSLContextImpl$TLS10Context
を使用して以降ではSSLContextImpl$DefaultSSLContext
を使用しています。コードを見ると、例外が発生するような相違はありません。
なぜ私は失敗するのでしょうか、getDefault()
コールを使用するメリットとデメリットは何ですか?
注:例外はApache HttpClient(バージョン4)を使用して最初に確認されました。このコードは、HttpClientで見られる問題を再現する最小のサブセットです。
ここ-Djavax.net.debug=ssl
を追加するとき、私は見誤りです:
main, READ: TLSv1 Alert, length = 2
main, RECV TLSv1 ALERT: fatal, bad_record_mac
%% Invalidated: [Session-101, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA]
main, called closeSocket()
main, handling exception: javax.net.ssl.SSLException: Received fatal alert: bad_record_mac
main, IOException in getSession(): javax.net.ssl.SSLException: Received fatal alert: bad_record_mac
は別の情報Iは、プロキシサーバー上のDiffie-Hellmanのをオフにした場合、エラーが発生しないということです。
-Djavax.net.debug = ssl、ハンドシェイクで再実行し、失敗した実行からの出力を投稿してください。 – EJP
デバッグオプションをオンにして再度実行します。この情報で質問を更新しました。誰にもアイデアはありますか? – user2687486
なぜ4行のコードを1本にするのが好きですか? – EJP