簡體   English   中英

當主機名包含“_”時,Java (JDK1.8) 不會在 SSL 握手中設置 server_name 擴展名

[英]Java (JDK1.8) is not setting server_name extension in SSL handshake when hostname has '_'

CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpget = new HttpGet(url);
System.out.println(httpclient.execute(httpget));

我正在使用這個編程片段並將它與幾個網址一起使用。 https://abc.def.com/file.txt ”和“ https://ab_c.def.com/file.txt ”(我使用的實際名稱存在 - 這只是一個例子)。 當我使用 -Djavax.net.debug=ssl:handshake:data 選項集運行代碼時,我看到 _ server_name _ 擴展名僅在 abc.def.com 的情況下添加,而在 ab_c.def.com 的情況下不添加。

我知道 java.net.URL 包不允許在主機名中使用“_”。 這是一個類似的問題嗎? 是否有任何解決方法可以讓 SSL 握手包含帶有“_”的主機名?

答案是不。 這在使用帶有 HTTPS 的標准 JDK 庫的 Java 中不起作用。

幾乎沒有“正常”的 Java 方法可以解決這個問題。 其他想法:

  • 要求服務所有者提供不帶_的域名。
  • 不要使用 SSL/HTTPS。 大多數未進行嚴格檢查的 Java HTTP 客戶端將使用帶有下划線的主機名。 如果您在開放的互聯網上,這不是一個很好的解決方案
  • 確實使用 HTTPS,但直接訪問 IP 地址並禁用 HTTPS 主機名驗證。 如果您在開放的互聯網上,這也是一個壞主意
  • 引入可以為您的服務提供 HTTP 端點的 MITM 或轉發代理,但會在網絡的不受信任部分執行 HTTPS,(SSL 加載?)
  • 只需外殼curl並讀取結果字符串,如Baeldung 上所述 在這里要非常小心,因為很容易在不知不覺中暴露自己的遠程代碼執行等安全問題
  • 使用 jni 訪問允許使用下划線的網絡庫 - libcurl是一個明顯的候選者,但這將比System.execute方法工作量大得多,也可能由於其他原因不安全(內存管理,寫得不好的 jni 互操作的不穩定) ,不利於可維護性)
  • 您可以嘗試在java.net分叉相關的 URI / URL 解析類以刪除對下划線的檢查。 問題在於這是一個巨大的黑客攻擊,可能具有無限的難度,很容易在無意中破壞各種事物,您可能需要構建自己的 JDK 版本,因為我記得java.net代碼由於某種原因而特殊因為你不能只是在 JVM 的 ext/lib 目錄中刪除一個補丁類(但我可以將它與其他東西混合在一起)。

我將提供一個修補程序。

在您的 /etc/hosts 文件中,在 IP 中包含一個不帶下划線的新條目。

例如,

abc.com xx.xx.xx.xx

然后,在您的程序中使用 abc.com。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM