SSL ハンドシェイク アラート: Java 1.7.0 へのアップグレード後の認識されない名前の問題
Java 1.6 から 1.7 にアップグレードすると、ユーザーは次のような問題に遭遇する可能性があります。 SSLHandshake アラートが発生し、エラー メッセージ「unrecognized_name」が表示されるWeb サーバーへの SSL 接続を確立します。このエラーは主に、デフォルトで有効になる Java 7 の Server Name Indication (SNI) サポートの導入が原因です。
この問題を解決するには、いくつかのオプションが利用可能です。
SNI をグローバルに無効にするには、次の手順を実行します。コマンドライン引数は、アプリケーションの実行時に使用できます:
-Djsse.enableSNIExtension=false
また、SSL アクションを実行する前に、プロパティをプログラムで設定することもできます:
System.setProperty("jsse.enableSNIExtension", "false");
ただし、SNI を無効にすると、その機能を必要とするアプリケーションに影響を及ぼします。
もう 1 つのアプローチには、「unrecogized_name」アラートをより適切に処理することが含まれます。次の手順を実行できます:
// Create an SSLSocket with the desired hostname SSLSocket sslsock = ... // Attempt handshake try { // This will block until the attempt succeeds or fails. sslsock.startHandshake(); } catch (SSLException e) { // Handle the exception here. If it contains the "unrecognized_name" message, disable SNI and retry. } // Disable SNI and retry handshake without hostname if (e.getMessage().contains("unrecognized_name")) { sslsock = ... // Create an SSLSocket without specifying a hostname sslsock.startHandshake(); }
提供されたコードは、信頼できない証明書を使用してサーバーに接続しようとします。証明書。これを軽減するには、カスタム信頼管理を実装するか、組み込みの信頼マネージャーを使用することを検討してください:
// Custom trust management (for untrusted certificates) TrustManager[] trustAllCerts = ... // Built-in trust manager TrustManager[] trustManagers = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()).getTrustManagers();
以上がJava 1.7 にアップグレードした後、「unrecognized_name」という SSL ハンドシェイク アラートが表示されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。