重複の可能性:
SSLハンドシェイクアラート:Java1.7.0へのアップグレード以降のunrecognized_nameエラー
私のJ2SEアプリは、HttpsUrlConnectionを使用して安全な場所にアクセスします。JREを1.7に更新するまでは、問題なく機能していました。これで、「ハンドシェイク中にリモートホストが接続を閉じました」SSLExceptionが発生します。JRE1.6とJRE1.7の両方で-Djavax.net.debug=ssl:handshakeを使用してアプリを実行した後、1.7ではキャッシュされたクライアントセッションを再開できないという印象があります。
更新:JRE 1.6では、クライアントアプリがSSLv2Helloカプセル化を使用していることを理解しました。ただし、JRE 1.7ではそれは行われません。これが、おそらく例外の原因です。私の質問はこれです:JRE 1.7で実行されているクライアントに対してSSLv2Helloカプセル化を有効にするにはどうすればよいですか?
更新#2:SSLv2Helloは、System.setProperty( "https.protocols"、 "TLSv1、SSLv2Hello")を介してJRE7で実行されます。ただし、これによってハンドシェイクの例外がなくなるわけではありません。例外の本当の理由は暗号スイートであることが判明しました。JRE 6では、サーバーはクライアントのオプションからSSL_RSA_WITH_RC4_128_MD5を選択しますが、JRE 7では、サーバーは常にTLS_DHE_RSA_WITH_AES_128_CBC_SHAを使用します。何らかの理由で、サーバーはTLS_DHE_RSA_WITH_AES_128_CBC_SHAを使用してキャッシュされたセッションを再開できません。System.setProperty( "https.cipherSuites"、suggestedCipherSuites)を使用してパッチが適用された問題。suggestedCipherSuitesは常にSSL_RSA_WITH_RC4_128_MD5で始まります。このアプローチの欠点はありますか?
更新#3:クライアントのSNI拡張機能は、サーバーを悩ませるものです。http://docs.oracle.com/javase/7/docs/technotes/guides/security/enhancements7.htmlの「JSSEクライアントのサーバー名表示(SNI)」を参照してください。