首頁 >Java >java教程 >為什麼 Java 1.7.0 會產生「unrecognized_name」SSL 握手警報,如何解決?

為什麼 Java 1.7.0 會產生「unrecognized_name」SSL 握手警報,如何解決?

Linda Hamilton
Linda Hamilton原創
2024-12-11 17:00:19389瀏覽

Why Does Java 1.7.0 Produce an

SSL 握手警報:Java 1.7.0 升級重新出現Unrecognized_Name 錯誤

從Java 1.6 升級到1.7 後,用戶可能會遇到以錯誤訊息為特徵的SSL握手警報「無法辨識的名稱。」這個問題特別是在與 Web 伺服器建立 SSL 連線時出現。

該錯誤源自於 Java 7 中引入的 SNI(伺服器名稱指示)支持,該支援預設為啟用。某些配置錯誤的伺服器在握手期間會回應「無法識別的名稱」警告,大多數用戶端都會忽略該警告,但 Java 不會。

解決方法選項:

Oracle 工程師已拒絕來解決這個問題。但是,有兩種主要的解決方法:

停用SNI:

  • 使用下列命令執行應用程式:java -Djsse.enableSNIExtension=false yourClass
  • 以程式設定屬性: System.setProperty("jsse.enableSNIExtension", "false");

請注意,停用 SNI 會影響整個應用程式。

處理設定錯誤的伺服器:

為了更有針對性的方法,請採用以下方法步驟:

  1. 使用主機名稱建立SSLSocket。
  2. 嘗試開始握手。
  3. 檢查是否有「unrecognized_name」錯誤。
  4. 如果發生錯誤,請重試開啟不含主機名稱的 SSLSocket(有效停用SNI)。

程式碼範例:

SSLSocketFactory factory = (SSLSocketFactory) SSLContext.getDefault().getSocketFactory();
SSLSocket sslsock = (SSLSocket) factory.createSocket(host, 443);
try {
  sslsock.startHandshake();
} catch (SSLException e) {
  if (e.getMessage().equals("handshake alert:  unrecognized_name")) {
    sslsock = (SSLSocket) factory.createSocket(host, 443);
    sslsock.startHandshake();
  } else {
    // Handle other errors
  }
}

結論:

透過實作所描述的解決方法,使用者所描述的解決方法,使用者可以在使用Java 1.7.0 並與伺服器設定錯誤,同時維護其他連線的SNI 功能。

以上是為什麼 Java 1.7.0 會產生「unrecognized_name」SSL 握手警報,如何解決?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn