互聯網上前一百萬個網站的 SSL/TLS 分析

jopen 10年前發布 | 15K 次閱讀 網站

目前看來評估不同的SSL/TLS配置已經逐漸成為了我的業余愛好。在10月份發表了Server Side TLS之后,我參與一些討論密碼性能、key的長短、橢圓曲線的安全等問題的次數都明顯增多了(比較諷刺的是,當初之所以寫“Server Side TLS”就是非常天真的希望減少我在這個話題上的討論次數)

SSL/TLS服務器端的配置教程如今越來越多。其中很快就得到關注的一篇是Better Crypto,我們曾經也在dev-tech-crpto郵件列表中討論了多次。

人們總是對這些話題非常有熱情(我也不例外)。但是有一個問題我們一直念念不忘,就是總想著盡快干掉那些被棄用的密碼,即便這意味著切斷了與一些用戶的連接。我是絕對反對這樣做的,并且始終堅信最好的做法是為所有用戶都維持向后兼容性,即使是以在我們的TLS服務器上保留RC43DES或是1024DHE key為代價。

最近在dev-tech-crypto上有這樣一個問題:“我們是否可以在Firefox上將RC4完全移除?”。有人可能認為,因為Firefox支持所有其他的密碼(AES, AES-GCM, 3DES, Camelia…),我們當然可以在不影響用戶的前提下移除RC4。但是我們沒有實際的數據來證明這一點,所以也不能隨便作出這樣的決定。

接收挑戰:我將帶上我的武器cipherscan出來兜兜風,并打算掃描下互聯網。

掃描方法

掃描腳本github數據結果在這里未壓縮的數據有1.2GB之大,但是XZ難以置信的將其壓縮成了一個只有17MB大小的數據存檔。

我使用Alexa所列出的前1,000,000個網站作為數據源。使用“testtop1m.sh”腳本并行掃描目標,并通過節流來限制同時掃描的數量(設置為100),然后將結果寫入到“results”目錄。每個掃描目標的結果被存放在一個json文件中。另一個腳本名為“parse_results.py”,它會掃一遍“results”目錄并計算統計數據。非常基礎的東東。

我花了大概36個小時來運行整個掃描流程。發現總共有451470個網站開啟了TLS,占總數的45%

雖然這不是一個全面的統計,但這一數據足以讓我們評價SSL/TLS在現實世界中的狀態。

對這451470個網站的SSL/TLS調查

密碼

Cipherscan返回了每個目標服務器上所有支持的密碼。下表顯示了普遍被支持的密碼以及僅被一些網站所支持的密碼。最后一項最有趣,似乎1.23%的網站僅接受3DES,而1.56%的網站僅接受RC4。這對于那些正考慮放棄支持3DESRC4的開發者來說是非常重要的數據。

值得注意的是:有兩個人不知出于什么原因僅僅只在他們的網站上開啟了Camellia。好吧先生們,我為你們舉杯。

對于那些不尋常的密碼,我為其添加了前綴“z”并放在列表底部,非常的顯眼。事實上從28%的網站明確支持DES-CBC-SHA這一點上可以看出更好的TLS文檔和培訓的必要性。

Supported Ciphers         Count     Percent
-------------------------+---------+-------
3DES                      422845    93.6596
3DES Only                 5554      1.2302
AES                       411990    91.2552
AES Only                  404       0.0895
CAMELLIA                  170600    37.7877
CAMELLIA Only             2         0.0004
RC4                       403683    89.4152
RC4 Only                  7042      1.5598
z:ADH-DES-CBC-SHA         918       0.2033
z:ADH-SEED-SHA            633       0.1402
z:AECDH-NULL-SHA          3         0.0007
z:DES-CBC-MD5             55824     12.3649
z:DES-CBC-SHA             125630    27.8269
z:DHE-DSS-SEED-SHA        1         0.0002
z:DHE-RSA-SEED-SHA        77930     17.2614
z:ECDHE-RSA-NULL-SHA      3         0.0007
z:EDH-DSS-DES-CBC-SHA     11        0.0024
z:EDH-RSA-DES-CBC-SHA     118684    26.2883
z:EXP-ADH-DES-CBC-SHA     611       0.1353
z:EXP-DES-CBC-SHA         98680     21.8575
z:EXP-EDH-DSS-DES-CBC-SHA 11        0.0024
z:EXP-EDH-RSA-DES-CBC-SHA 87490     19.3789
z:EXP-RC2-CBC-MD5         105780    23.4301
z:IDEA-CBC-MD5            7300      1.6169
z:IDEA-CBC-SHA            53981     11.9567
z:NULL-MD5                379       0.0839
z:NULL-SHA                377       0.0835
z:NULL-SHA256             9         0.002
z:RC2-CBC-MD5             63510     14.0674
z:SEED-SHA                93993     20.8193

密匙協商

讓人驚喜的是部署了ECDHE的比例。21%雖然不算是一場勝利,但是對于其被視為一種非常有希望在不久的將來取代RSA(至少是在密匙協商方面)的算法來說,這卻是一個鼓舞人心的數字。

DHE,從SSLv3開始支持到現在已經有接近60%的部署量。我們需要盡快將這個數字提升到100%

Supported Handshakes      Count     Percent
-------------------------+---------+-------
DHE                       267507    59.2524
ECDHE                     97570     21.6116

PFS

完全正向保密(perfect forward secrecy)目前非常流行,所以評估它的部署量最有趣。事實上我重復檢查了3次結果才確定下表所示的比例,75%的網站支持PFS,非常準確,因為對我來講這是非常大的數量。更令人驚訝的是,事實上61%被測試的網站,要么是自己傾向、要么是讓客戶端傾向于PFS key交換(DESECDHE)而不是其它密碼。

不出所料,絕大多數——98%DHE key1024位。導致這個情況的原因如下:

  1. Apache2.4.6及其以前的版本中,DH參數總是設置為1024位并且不是用戶所能配置的。未來Apache的版本會為DH參數自動選擇一個更好的值。

  2. java6,或許還有一些其它的庫,并不支持大于1024位的DHE key

所以,雖然大家都同意需要一個2048位的RSA算法模型,但使用1024位的DHE key,即便其有效的降低了TLS的安全性,可目前還沒有任何的解決辦法——不同于打破舊客戶端的向后兼容性。

ECDHE這方面,總是使用P-256曲線來完成握手。同樣的,這也很容易理解,因為IECHromeFirefox目前僅僅持P256。但是根據最近由DJBLange發表的研究顯示,這可能不是最安全的選擇。

下表中的曲線統計存在一些瑕疵:Cipherscan在底層使用OpenSSL,而我并不確定OpenSSL是如何在握手階段選擇曲線的。這是Cipherscan需要改進的一塊,所以希望大家不要受這些數字的影響。

Supported PFS             Count     Percent  PFS Percent
-------------------------+---------+--------+-----------
Support PFS               342725    75.9131
Prefer PFS                279430    61.8934

DH,1024bits               262561    58.1569  98.1511
DH,1539bits               1         0.0002   0.0004
DH,2048bits               3899      0.8636   1.4575
DH,3072bits               2         0.0004   0.0007
DH,3248bits               2         0.0004   0.0007
DH,4096bits               144       0.0319   0.0538
DH,512bits                76        0.0168   0.0284
DH,768bits                825       0.1827   0.3084

ECDH,P-256,256bits        96738     21.4273  99.1473
ECDH,B-163,163bits        37        0.0082   0.0379
ECDH,B-233,233bits        295       0.0653   0.3023
ECDH,B-283,282bits        1         0.0002   0.001
ECDH,B-571,570bits        329       0.0729   0.3372
ECDH,P-224,224bits        4         0.0009   0.0041
ECDH,P-384,384bits        108       0.0239   0.1107
ECDH,P-521,521bits        118       0.0261   0.1209

協議

在協議掃描的結果中有些地方讓我很吃驚:仍然有18.7%的網站支持SSLv2!拜托,各位,我們已經重復了這個問題有很多年了:SSLv2漏洞太多了,不要使用它!

我非常欣賞這38個僅僅接受SSLv2的網站。干的好。

同樣有趣的是,2.6%的網站支持TLSv1.2,而不是TLS1.1。合理的情況下,TLSv1.2網站的數量應該大于2.6%才對,但事實并非如此(只有0.001%).所以我只能想象,出于某些原因,網站都使用TLSv1TLSv1.2,而不是1.1

更新:HN上的“harshreality找出了一條OpenSSL中的更新日志可以來解釋這種行為:

Changes between 1.0.1a and 1.0.1b <a title="26 Apr 2012" >26 Apr 2012</a>
- OpenSSL 1.0.0 sets SSL_OP_ALL to 0x80000FFFL and OpenSSL 1.0.1 and 1.0.1a set SSL_OP_NO_TLSv1_1 to 0x00000400L which would unfortunately mean any application compiled against OpenSSL 1.0.0 headers setting SSL_OP_ALL would also set SSL_OP_NO_TLSv1_1, unintentionally disablng TLS 1.1 also. Fix this by changing the value of SSL_OP_NO_TLSv1_1 to 0x10000000L Any application which was previously compiled against OpenSSL 1.0.1 or 1.0.1a headers and which cares about SSL_OP_NO_TLSv1_1 will need to be recompiled as a result.

不出所料,絕大多數網站都支持SSLv3TLSv1,分別為99.6%98.7%。有少量的網站支持TLS1.11.2,這令人擔憂,但一點也不奇怪。

考慮到近期的商業產品對TLS版本的可憐的支持,所以這也不能怪系統管理員。供應商可以肯定會推動這一進程,所以在你更新下一個合同前,確保將TLSv1.2加入你的心愿單。

Supported Protocols       Count     Percent
-------------------------+---------+-------
SSL2                      85447     18.9264
SSL2 Only                 38        0.0084
SSL3                      449864    99.6443
SSL3 Only                 4443      0.9841
TLS1                      446575    98.9158
TLS1 Only                 736       0.163
TLS1.1                    145266    32.1762
TLS1.1 Only               1         0.0002
TLS1.2                    149921    33.2073
TLS1.2 Only               5         0.0011
TLS1.2 but not 1.1        11888     2.6332

哪些沒有被測試?

這不是一個全面的測試。還有RSA key的大小沒有被評估。同時還有TLS擴展,OCSP Stapling支持,以及一些值得反復觀察的有趣的特征。下次再說吧。

培訓,以及向后兼容

如果要說這個小實驗說明了些什么問題,那就是舊的密碼和協議還遠遠沒有被拋棄。當然,如今你可以決定在客戶端上干掉RC43DES,但是要注意有一小部分的因特網將是你和你的用戶連接不到的。

對這個情況我們可以做什么?培訓是關鍵:TLS是一個復雜的專題,而大多數的管理員和網站所有者沒有時間和知識去找遍幾十個郵件列表和博客來得到最好的配置選擇。

這也是編寫Server Side TLSBetter Crypto等文檔的首要動機。我們中的一些人是致力于改進這些文檔的。但是我們需要一個團隊來傳播這些信息,在會議、郵件列表和用戶群中指導管理員們,同時推動網站所有者為他們的網站添加更多的安全配置。我們需要一些幫助:去那里!教TLS吧!

原文鏈接: Julien Vehent   翻譯: 伯樂在線 - deathmonkey
譯文鏈接: http://blog.jobbole.com/55550/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!