2014-11-24 238 views
0

我的幾臺機器無法連接到Internet上的某些HTTPS服務器。爲了調試這個我已經開始學習openssl s_client和TLS 1.2協議,現在感到困惑的東西,因爲我調試:openssl s_client不提供握手中指定的協議版本

在我的一些機器,如果我調用

openssl s_client -debug -tls1_2 -connect admin.fedorahosted.org:443 

客戶端啓動握手用十六進制字節

16 03 03 ... 

,但在大多數機器就開始

16 03 01 ... 

前者表示協議爲TLS 1.2,後者表示爲TLS 1.0。前者聽起來是合理的,因爲我在命令行中指定了這個權限,但由於我明確要求TLS 1.2,第二個將會發生,這對我來說似乎很奇怪。

我在所有測試過的CentOS機器上完成了yum update,所以它們名義上都處於openssl的相同級別。

這裏可能會發生什麼?

回答

0

SSL/TLS是一種基於記錄的協議,每個記錄在5字節頭中都有一個版本字段,這就是你在(未加密的)握手記錄中看到的,用於設置密碼和協議版。

在握手交換中,協議版本和密碼在「hello」記錄中進行協商。 client hello包含客戶端支持的最高版本的字段,並且server hello(回覆中)包含最低的共享版本。假設客戶端和服務器支持連續範圍的版本,如果它們不重疊協議版本發送警報(此時客戶端可能會嘗試使用不同版本)。

RFC 5246 Appendix E詳細說明了嘗試連接和確定協議的預期邏輯。它也包含你可以觀察這個問題的說明:一些服務器實現已知錯誤地執行版本 談判:

注意。例如,當客戶端提供比TLS 1.0更新版本的 版本時,會有簡單地關閉連接的服務器TLS 1.0 。另外,如果在 ClientHello中包含任何TLS擴展,則已知某些服務器將拒絕連接 。與這些有問題的服務器的互操作性是超出本文檔範圍的複雜 主題,並且可能需要客戶端的多個 連接嘗試。

很長一段時間它不是經常看到的第一個數據包(「客戶你好」),以最大限度地提高互操作性SSLv2.0,但你應該只能看到很老的軟件現在(尤其是因爲沒有支持爲SNI and various other extensions,至少需要TLSv1.0)。有一個在這個Security.SE問題多一點背景:https://security.stackexchange.com/questions/34827/why-clients-offer-handshaking-with-ssl-2-0-protocol

現在,作爲爲什麼你看到在您的系統不同的行爲,我不能說沒有CentOS的和封裝版本。你可以用openssl version -a來檢查你的OpenSSL版本,看看是否有補丁級別的差異。 Red Hat(以及CentOS)包含了OpenSSL的大量補丁(除了刪除各種專利算法外,還有大約65個補丁可以改變行爲或後端補丁和功能)。該CHANGES的(官方)1.0.1a描述你所看到的,但我猜在這裏:

*) Workarounds for some broken servers that "hang" if a client hello 
    record length exceeds 255 bytes. 

    1. Do not use record version number > TLS 1.0 in initial client 
     hello: some (but not all) hanging servers will now work. 
    2. [...] 
+1

什麼完整的答案。現在所有的機器都以相同的方式運行,所以我無法在我的最後進一步挖掘。如果我再次遇到這個問題,我會有這個帖子來指導我。謝謝 ! – user3624334 2015-01-15 16:44:44