2013-10-07 56 views
0

在SSL握手期間,SSL握手過程中檢查的服務器的域名是否與服務器正在運行的域中檢查的服務器域中的域名相符?在SSL握手過程中檢查服務器的域名

示例:假設服務器證書具有域mydomain.com。如果服務器在域中運行someotherdomain.com ...這是否在SSL握手期間被拒絕並因爲mydomain.com不是someotherdomain.com而中止?

回答

2

這取決於...

SSL/TLS標準本身並未指定如何以及何時驗證服務器證書。

introduction

[...]關於如何啓動TLS握手,以及如何解釋交換留在認證證書運行在協議的設計者和實現的判斷決定TLS的頂部。

這就是說,雖然它沒有指定認證如何有發生,實現意味着握手期間進行這樣的檢查(或後立即至少):

  • Appendix D
  • 某些error messages與證書認證失敗(bad_certificate,certificate_expired,...)明顯相關。
  • 一些在handshake overview文字:「[...]如果服務器進行身份驗證,它可以從客戶端請求證書,如果是適當的選擇的加密套件

在大多數情況下,證書驗證本身由RFC 3280/RFC 5280指導。 默認情況下,許多SSL/TLS堆棧至少會這樣做。

主機名稱驗證可以被認爲是證書驗證步驟之一,它歷史上已經單獨實施。這主要是因爲RFC 3280/RFC 5280沒有解決這一步驟並將其留給每個應用程序協議。在RFC 6125中有一個相對最近的協調嘗試(你可以在附錄B中找到協議的區別)。

在SSL/TLS握手期間是否完成主機名檢查取決於您正在使用的庫以及配置方式。

例如,在Java 7之前,這必須與主JSSE API(SSLSocket/SSLEngine)分開進行。 (例如,這在HttpsURLConnection中完成,但是它位於JSSE的頂部,而不在此範圍內。)從Java 7開始,可以在握手過程中和JSSE內使用X509ExtendedTrustManager執行此檢查,但必須對其進行配置使用SSLParameters.setEndpointIdentificationAlgorithm(...),其中only supports HTTPS and LDAPS(這就是說,即使你的服務沒有使用HTTP,使用HTTPS作爲端點識別算法也不是一個不錯的選擇,肯定比沒有好)。

其他SSL/TLS庫或用其他語言包裝其他庫往往至少有回調。它們是否被開發人員使用(並正確使用)取決於,如this paper所示。 (您可能也有興趣在Security.SE上this question

0

編號主機名檢查是HTTPS的一部分,而不是SSL。

+0

該問題沒有說一個關於HTTPS的單詞;) –

0

是的。在SSL握手期間,正確的客戶端應將其連接的主機名與證書中指定的域名進行比較。不這樣做會使TLS無用,因爲MITM攻擊在其他方面微不足道。

請注意,存在許多寫得不好的軟件,它們會接受任何提供的證書並且不會執行適當的證書驗證。最近有關於Android軟件的這個問題的報告。看來成千上萬的軟件頭銜(主要是免費軟件)沒有執行適當的驗證,因此給用戶帶來了安全風險。

+0

SSL/TLS假定服務器的私鑰沒有被泄露。如果我正確的話,如果MITM由HTTPS實現,則RFC 6125解決了這個問題。 – Chandu

+0

@ user1197140服務器的真實性以某種方式進行檢查(對於證書,這是一個驗證過程,但TLS不僅支持基於證書的身份驗證)。鑰匙是否被妥協 - 這是一個完全不同的故事。檢查地址(或域名)是爲了確保您連接到期望的服務器A,並且MITM不會提供爲服務器B頒發的證書。 –