天天看點

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

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

之前我們介紹SSL工作原理了解到當你在浏覽器的位址欄上輸入https開頭的網址後,浏覽器和伺服器之間會在接下來的幾百毫秒内進行大量的通信。這些複雜的步驟的第一步,就是浏覽器與伺服器之間協商一個在後續通信中使用的密鑰算法。這個過程簡單來說是這樣的:

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

伺服器接收到浏覽器的所有Cipher後,與自己支援的套件作對比,如果找到雙方都支援的Cipher,則告知浏覽器;

浏覽器與伺服器使用比對的Cipher進行後續通信。如果伺服器沒有找到比對的算法,浏覽器(以Firefox 30為例,後續例子中使用的浏覽器均為此版本的Firefox)将給出錯誤資訊:

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

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,會看到下面的選項:

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

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

0 – SSL 3.0

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個:

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

如果繼續找一個Info為“ServerHello”的封包,可以在類似的位置找到伺服器傳回的Cipher,在本例中是TLS_ECDHE_RSA_WITH_AES_256_CBC

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

_SHA:

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

2. 伺服器

讓我們以Windows為例。若要檢視作業系統支援哪些密鑰算法,可以運作gpedit.msc,依次進入”Computer Configuration” -> ”Administrative Templates” -> “Network” -> “SSL Configuration Settings”,這時可以在視窗右邊看到”SSL Cipher Suite Order”項:

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

點選該項後進入”SSL Cipher Suite Order”。這裡可以看到作業系統支援的Cipher的集合,以及對不同Cipher的排序

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

如果需要調整這裡排序,或者去掉一些弱的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),請聯系易維信技術支援進行修複。