SSL 握手警報:升級到Java 1.7.0 後出現無法辨識的名稱問題
從Java 1.6 升級到1.7 後,用戶可能會遇到建立SSL 時出現SSLHandshake警報,並顯示錯誤訊息「unrecognized_name」連接到網頁伺服器。此錯誤主要是由於 Java 7 引入了伺服器名稱指示 (SNI) 支持,該支援預設為啟用。
要解決此問題,有多個選項可用:
要全域停用SNI,請使用以下命令列參數可以在運行應用程式時使用:
-Djsse.enableSNIExtension=false
或者,可以在執行任何SSL 操作之前以程式設計方式設定該屬性:
System.setProperty("jsse.enableSNIExtension", "false");
但是,停用SNI 可能會對應用程式產生影響需要其功能。
另一種方法涉及更優雅地處理「unrecognized_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中文網其他相關文章!