SSL證書(HTTPS)背後的加密算法


以前咱們介紹SSL工做原理瞭解到當你在瀏覽器的地址欄上輸入https開頭的網址後,瀏覽器和服務器之間會在接下來的幾百毫秒內進行大量的通訊。這些複雜的步驟的第一步,就是瀏覽器與服務器之間協商一個在後續通訊中使用的密鑰算法。這個過程簡單來講是這樣的:html

瀏覽器把自身支持的一系列Cipher Suite(密鑰算法套件,後文簡稱Cipher)[C1,C2,C3, …]發給服務器;算法

服務器接收到瀏覽器的全部Cipher後,與本身支持的套件做對比,若是找到雙方都支持的Cipher,則告知瀏覽器;shell

瀏覽器與服務器使用匹配的Cipher進行後續通訊。若是服務器沒有找到匹配的算法,瀏覽器(以Firefox 30爲例,後續例子中使用的瀏覽器均爲此版本的Firefox)將給出錯誤信息:瀏覽器

瀏覽器與服務器使用不匹配的Cipher進行通訊

1. 瀏覽器

瀏覽器支持哪些Cipher?這取決於瀏覽器支持的SSL/TLS協議的版本。習慣上,咱們一般把HTTPS與SSL協議放到一塊兒;事實上,SSL 協議是Netcape公司於上世紀90年代中期提出的協議,自身發展到3.0版本。1999年該協議由ITEL接管,進行了標準化,更名爲TLS。能夠 說,TLS 1.0就是SSL 3.1版本。安全

目前TLS最新版本是1.2。互聯網上有超過99%的網站支持TLS 1.0,而支持TLS 1.2的網站尚不足40%。打開Firefox瀏覽器,在地址欄中輸入about:config,而後搜索tls.version,會看到下面的選項:服務器

在地址欄中輸入about:config

其中security.tls.version.min和security.tls.version.max兩項決定了Firefox支持的SSL/TLS版本,根據Firefox文檔的介紹,這兩項的可選值及其表明的協議是:網絡

0 – SSL 3.0ide

1 – TLS 1.0函數

2 – TLS 1.1工具

3 – TLS 1.2

所以上圖的設置說明當前瀏覽器支持協議的下限是SSL 3.0,上限是TLS 1.2。如今,若是把security.tls.version.min一項改成3,那麼瀏覽器就只支持TLS 1.2了。前文提到,目前只有不足40%的網站支持TLS 1.2,好比Amazon就不在這40%之列,因此此時訪問https://amazon.com,就會收到「Secure Connection Failed」的錯誤信息,如圖1所示。

瞭解了SSL/TLS協議後,可使用Wireshark(或相似的能夠抓去網絡包的工具)經過分析網絡包的信息,來查看瀏覽器發送給服務器的全部Cipher。

瀏覽器會首先發起握手協議,既一個「ClientHello」消息,在消息體中,能夠找到Firefox支持的Cipher。在Wireshark 中,按照Protocol協議排序,而後從TLS 1.2協議的報文中找到一個Info爲「Client Hello」的。選中這個,而後在下面的報文信息窗口中依次找到Secure Sockets Layer -> TLSv1.2 Record Layer -> Handshake Protocal -> Cipher Suites。例子中的第一個Cipher是TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,一共有23個:查看瀏覽器發送給服務器的全部Cipher

若是繼續找一個Info爲「ServerHello」的報文,能夠在相似的位置找到服務器返回的Cipher,在本例中是TLS_ECDHE_RSA_WITH_AES_256_CBC服務器返回的Cipher_SHA:

關於密鑰算法這一長串名字的含義,後面說明。接下來,瀏覽器就要等待服務器響應它的請求。咱們來看一看服務器端都作了些什麼。

2. 服務器

讓咱們以Windows爲例。若要查看操做系統支持哪些密鑰算法,能夠運行gpedit.msc,依次進入」Computer Configuration」 -> 」Administrative Templates」 -> 「Network」 -> 「SSL Configuration Settings」,這時能夠在窗口右邊看到」SSL Cipher Suite Order」項:

運行gpedit.msc

點擊該項後進入」SSL Cipher Suite Order」。這裏能夠看到操做系統支持的Cipher的集合,以及對不一樣Cipher的排序

SSL Cipher Suite Order

若是須要調整這裏排序,或者去掉一些弱的Cipher,能夠點擊左上角的「Enabled」,而後在「Options」中重寫編輯Cipher的列表。若是喜歡命令行,能夠經過下面的Powershell命令修改密鑰算法套件:

Set-ItemProperty -path HKLM:\SOFTWARE\Policies\Microsoft\Cryptography\Configuration\SSL\0001002 -name Functions -value "XXX,XXX,XXX"

  那麼Cipher的這一長串名字是什麼含義呢?其實,每種Cipher的名字裏包含了四部分信息,分別是

密鑰交換算法,用於決定客戶端與服務器之間在握手的過程當中如何認證,用到的算法包括RSA,Diffie-Hellman,ECDH,PSK等

加密算法,用於加密消息流,該名稱後一般會帶有兩個數字,分別表示密鑰的長度和初始向量的長度,好比DES 56/56, RC2 56/128, RC4 128/128, AES 128/128, AES 256/256

報文認證信息碼(MAC)算法,用於建立報文摘要,確保消息的完整性(沒有被篡改),算法包括MD5,SHA等。

PRF(僞隨機數函數),用於生成「master secret」。

  徹底搞懂上面的內容彷佛還須要一本書的介紹(我已經力不從心了)。不過大體瞭解一下,有助於理解Cipher的名字,好比前面服務器發回給客戶端的Cipher,

  TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA

  從其名字可知,它是

基於TLS協議的;

使用ECDHE、RSA做爲密鑰交換算法;

加密算法是AES(密鑰和初始向量的長度都是256);

MAC算法(這裏就是哈希算法)是SHA。

熟悉了Cipher名字背後的含義後,讓咱們看看像IIS這樣的Web服務器如何選擇一個密鑰算法呢?假如瀏覽器發來的密鑰算法套件爲[C1, C2, C3],而Windows Server支持的套件爲[C4, C2, C1, C3]時,C1和C2都是同時被雙方支持的算法,IIS是優先返回C1,仍是C2呢?答案是C2。IIS會遍歷服務器的密鑰算法套件,取出第一個C4,發現瀏覽器並不支持;接下來取第二個C2,這個被瀏覽器支持!因而,IIS選擇了C2算法,並將它包含在一個「ServerHello」握手協議中,發回給客戶端。這就有了圖5中的結果。

3. 選擇

做爲瀏覽器的使用者,你可讓瀏覽器只能訪問支持TLS 1.2協議的站點,以得到更好的安全性,以及更差的體驗。做爲服務器的維護者,彷佛將最強壯的Cipher排在前面是正確的選擇。SSL證書部署成功後, 易維信技術會幫用戶檢查服務器端的加密套件,在咱們的安全檢查中,經常被報出的問題之一就是服務器默認的Cipher太弱(RC4-based),請聯繫易維信技術支持進行修復。

相關文章
相關標籤/搜索