簡體   English   中英

連接時Java1.7 TLS1.2實現是否考慮了dNSName(SAN擴展)?

[英]Does Java1.7 TLS1.2 implementation take dNSName (SAN extension) into account when connecting?

我正在實現一個協議,該協議將TLS1.2指定為傳輸層,並且需要客戶端服務器身份驗證,通過將連接客戶端套接字的主機名值與其證書中服務器指示的值(即subjectAltName擴展名)進行比較,以驗證服務器的主機名的類型為dNSName

我創建了一個測試,將該值放入服務器的證書中,客戶端似乎完全忽略了它,但是我想確定一下。 我是否必須在X509ExtendedTrustManager.checkServerTrusted(X509Certificate[], String, Socket)的實現編寫此檢查的代碼X509ExtendedTrustManager.checkServerTrusted(X509Certificate[], String, Socket)還是可以通過一些晦澀的屬性來啟用它? 參考指南對此問題保持沉默。

協議規范(我正在實現的規范)還提到通配符可以用作證書中值的前綴。

“ *”通配符可以用作證書中最左邊的名稱部分。 例如,*。example.com將匹配a.example.com,foo.example.com等,但不匹配example.com。

但是,當我嘗試使用keytool創建這樣的擴展值時,它拒絕這樣做。 這是怎么回事?

“ C:\\ Program Files \\ Java \\ jdk1.7.0_51 \\ bin \\ keytool.exe” -genkeypair-別名服務器-keyalg RSA -validity 365 -ext san = dns:*。example.com -keystore mykeystore ...

keytool錯誤:java.lang.RuntimeException:java.io.IOException:DNSName組件必須以字母開頭

Java 7提供了一種在SSLSocketSSLEngine上自動驗證主機名的方法,但是不會自動啟用它(Java 6中不存在)。 該實現可以使用LDAP或HTTPS的命名規范,而不是更通用的RFC 6125(至少現在還沒有)。 在大多數情況下,對於其他協議,使用HTTPS規范的這一部分應該很好,當然總比沒有好。

您可以如下使用它:

SSLParameters sslParams = new SSLParameters();
sslParams.setEndpointIdentificationAlgorithm("HTTPS");
sslSocket.setSSLParameters(sslParams); // or SSLEngine

您可以找到以下參考:

您遇到的第二個問題似乎是keytool的問題,無法生成這樣的證書。 這不會影響如何驗證提供給Java客戶端的此類證書。 如有必要,您可以使用其他工具來生成帶有通配符的證書。

編輯:

請注意,要使此方法起作用,您需要使用使用String host (這樣才能知道主機名)的方法或使用SSLContext.createSSLEngine(String peerHost, int peerPort)SSLEngine來創建SSLSocket 這樣便可以知道要在證書中嘗試匹配的主機名。 (對於SNI,使用名稱也很有用。)

主機名驗證參考指南:

http://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#ciphersuitechoice

使用原始SSLSocket和SSLEngine類時,應始終在發送任何數據之前檢查對等方的憑據。 SSLSocket和SSLEngine類不會自動驗證URL中的主機名是否與對等方憑據中的主機名匹配。 如果未驗證主機名,則可以通過URL欺騙利用應用程序。

因此,您必須手動執行此操作。 從概念上講,此任務不是TrustManager職責的一部分; 建立連接后,最好通過檢查對等證書來完成此操作。

奇怪的是,沒有公共的API可以做到這一點。 如果您不介意依賴sun.*包,則可以使用sun.security.util.HostnameChecker.match(String expectedName, X509Certificate cert)

我也在研究相關問題,幾天后我將發布我的API。


通配符證書-我剛剛向jdk開發人員提出了同樣的問題,等待回應-http: //mail.openjdk.java.net/pipermail/security-dev/2014-September/011153.html

暫無
暫無

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

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