HTTPS中的對稱密鑰加密,公開密鑰加密,數字證書
密鑰
我們将未加密的内容稱為明文,加密之後的内容稱為密文。
簡單來說,要加密一段明文,可以将這段内容輸入到一個加密函數中,輸出密文。但這種簡單的加密方式存在被人盜取到加密函數進而破解明文的危險,且加密函數一般構成複雜,一旦被盜取更換成本較高。
于是人們想出了一個辦法,在加密函數中再添加一個參數,這個參數隻有通信雙方知道,沒有參數則無法正确解密出明文。這個參數被稱為密鑰。對于同一個加密函數而言,密鑰值的不同則加密方式也不同,得出的密文也就不同。這樣加密系統的安全性提高了,被盜取密鑰之後更換密鑰的成本也低了很多。常見的情景是加密函數都是使用公開的算法,使用者需要儲存的僅僅是自己的密鑰。
對稱密鑰加密
對稱密鑰加密就是加密與解密使用相同的是密鑰值。
流行的對稱密鑰加密包括:
- DES
- TRiple-DES
- RC2
- RC4
對稱密鑰需要通信雙方共享密鑰。對網際網路通信而言,不同的通信雙方需要不同的對稱密鑰,如果有N個使用者需要互相通信,總共需要密鑰數N*(N-1)。
公開密鑰加密
對稱密鑰加密存在需要密鑰數太多以及傳遞密鑰不友善的缺點,于是人們研究出非對稱的密鑰加密技術,即加密和解密的密鑰不需要一樣。常見的一種稱為公開密鑰加密。
公開密鑰加密将通信一端的加密和解密密鑰分成兩個,其中加密密鑰可以公開釋出,也就是随便誰都可以使用該加密密鑰為明文加密,但要解密這段密文隻能靠該端私有的解密密鑰。這解決了對稱密鑰加密中的缺點。其中公開的加密密鑰稱為公開密鑰,私有的解密密鑰稱為私有密鑰。
要保證公開密鑰加密的可用性必須確定以下情況無法計算出私有密鑰:
- 有公開密鑰;
- 一段密文;
- 一段明文和使用公開密鑰加密過的密文;
流行的公開密鑰加密包括:
- RSA
- DH
- ECDHE
- ECDH
- DHE
公開密鑰加密雖然更加簡單安全但其加密算法運算比較慢,是以一般混合使用公開密鑰加密和對稱密鑰加密的使用方式,即先通過公開密鑰加密擷取到對稱密鑰加密的密鑰,再通過對稱密鑰加密傳輸資料。這種情況在後文說明。
數字簽名
對稱密鑰加密和公開密鑰加密都是将封包加密的技術。但加密能做的不止如此,還可以用加密算法來證明封包是誰編寫的以及中途沒有被篡改。數字簽名就是這種技術。
數字簽名是附加在封包上的特殊加密校驗碼。其使用了私有密鑰加密生成校驗碼,除發送者外其他人都無法重新生成對應的校驗碼,這樣就證明了封包的身份以及中途沒有被人篡改過。
數字簽名通常通過公開密鑰技術産生,但使用方式相反。發送者首先為要簽名内容生成封包摘要,使用簽名函數并輸入私有密鑰作為參數,對封包摘要進行加密,生成簽名并随封包一起發送出去。接收者通過附加了公開密鑰參數的簽名函數反函數将簽名解密,并與生成的封包摘要進行對比,如果結果一緻則代表封包無誤。
常見的RSA加密系統可以同時用于公開密鑰加密和數字簽名。RSA加密系統将解碼函數D作為簽名函數使用,編碼函數E作為解簽名函數。
數字證書
單純的公開密鑰加密隻适合對等的兩端通信,對于常用的伺服器-用戶端通信模式仍存在一些問題。1是公開密鑰加密隻能證明封包确實是發送方發送的且沒有篡改,但發送方本身是誰則無從得知,因為誰都可以生成公鑰私鑰對。如果把所有需要通路的網站的公鑰都事先儲存下來,數量巨大不說,如何發送這些公鑰且如何證明儲存的公鑰确實是這個網站的公鑰也是個問題。數字證書則可以解決這些問題。
數字證書是網絡上的身份證明。一般包括如下内容:
- 證書格式版本号
- 證書序列号;
- 證書簽名算法;
- 證書頒發者;
- 有效期;
- 對象名稱;
- 對象公開密鑰;
- 證書頒發者的數字簽名;
其中頒發者的數字簽名是通過數字證書的其餘部分的封包摘要經證書簽名算法及證書頒發者的私有密鑰計算出的,用于驗證數字證書的真實性。
任何人都能自行生成一個數字證書,但隻有值得信任的組織(CA)生成的數字證書才會預設被浏覽器信任。具體原因在下一節說明。
詳解數字證書驗證流程
關于浏覽器驗證網站數字證書的流程網上的資料一般講的都不是很清楚。在查閱了不少資料後終于搞清楚這部分。
CA下發給網站的證書都是一個證書鍊,也就是一層一層的證書,從根證書開始,到下級CA,一層一層,最後一層就是網站證書。
浏覽器收到伺服器發送的證書後,需要驗證其真實性。而證書的簽名是通過簽名算法和上級CA的私鑰生成的,并非很多文章裡簡單說的靠CA私鑰生成。浏覽器需要用上級CA的公鑰才能解密簽名,并與生成的指紋對比,那麼問題來了,這個上級CA的公鑰從哪來呢?
答案是此公鑰來自于證書鍊該層的上級CA的證書明文内。單個X509v3證書由以下部分組成:
X.509v3證書由三部分組成:
- tbsCertificate (to be signed certificate),待簽名證書。
- SignatureAlgorithm,簽名算法。
- SignatureValue,簽名值。
tbsCertificate又包含10項内容,在HTTPS握手過程中以明文方式傳輸:
- Version Number,版本号。
- Serial Number,序列号。
- Signature Algorithm ID,簽名算法ID。
- Issuer Name,發行者。
- Validity period,有效時間。
- Subject name ,證書主體名稱。
- Subject Public Key Info ,證書主體公鑰資訊,包含公鑰算法和公鑰值。
- Issuer Unique Identifier (optional),發行商唯一ID。
- Subject Unique Identifier (optional),主體唯一ID。
- Extensions (optional),擴充。
證書鍊由多個證書一層一層組成的,除了最底層的網站證書的公鑰是給使用者加密封包外,其他層證書中的公鑰均用于解密底層的證書指紋簽名。最高層的根證書是自簽名的,也就是自己頒發給自己,是以它的公鑰不僅用來解密下層的簽名,也用來給自己的簽名解密。
驗證證書是否真實的任務完成了,那麼證書是否可靠如何驗證呢?一句話,隻要根證書可靠,整個證書鍊就可靠,而根證書是否可靠要看這個根證書是否在作業系統或浏覽器内置的可信根證書内,在的話就可信。
HTTPS
HTTPS是在HTTP封包發送給TCP之前對封包進行加密的安全協定。使用443端口進行通信。
普通的HTTP有如下四層:
- 應用層HTTP
- 傳輸層TCP
- 網絡層IP
- 資料鍊路層
HTTPS多了一個安全層:
- 應用層HTTP
- 安全層SSL/TLS
- 傳輸層TCP
- 網絡層IP
- 資料鍊路層
證書密鑰驗證都是在安全層驗證。常用的SSL/TLS程式設計實作庫是OPENSSL。
HTTPS實際驗證過程
此部分内容主要參考《SSL/TLS協定運作機制的概述》http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
實際的HTTPS驗證過程如下:
ClientHello階段
- 支援的協定版本,比如TLS 1.0版;
- 一個用戶端生成的随機數,稍後用于生成”對話密鑰”;
- 支援的加密方法,比如RSA公鑰加密;
- 支援的壓縮方法;
ServerHello階段
- 确認使用的加密通信協定版本;
- 一個伺服器生成的随機數,稍後用于生成”對話密鑰”;
- 确認使用的加密方法,比如RSA公鑰加密;
- 伺服器證書;
對于需要驗證使用者證書的還會包含請求要求使用者提供證書。
用戶端回應
用戶端收到回應後首先驗證伺服器證書:
- 是否由可信CA頒布;
- 證書中域名是否與實際域名一緻;
- 是否在有效期内;
證書沒問題的話用戶端會回應以下内容:
- 一個随機數(pre-master key)。該随機數用伺服器公鑰加密,防止被竊聽;
- 編碼改變通知,表示随後的資訊都将用雙方商定的加密方法和密鑰發送;
- 用戶端握手結束通知,表示用戶端的握手階段已經結束。這一項同時也是前面發送的所有内容的hash值,用來供伺服器校驗;
此時通信雙方都有了這三個随機數。通過商定的加密方法根據三個随機數生成一個相同的會話密鑰SessionSecret,用于之後的對稱加密。
伺服器回應
伺服器收到回應後計算出SessionSecret,并發送以下内容給用戶端:
- 編碼改變通知,表示随後的資訊都将用雙方商定的加密方法和密鑰發送;
- 伺服器握手結束通知,表示伺服器的握手階段已經結束。這一項同時也是前面發送的所有内容的hash值,用來供用戶端校驗
這樣HTTPS握手過程就結束了,之後就是通過HTTP發送經過對稱加密的封包。
參考資料:
- 《HTTP權威指南》一書
- 《數字證書原理》http://www.cnblogs.com/JeffreySun/archive/2010/06/24/1627247.html
- 《數字簽名是什麼?》http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
- 《HTTPS通信中的身份認證機制》https://cnodejs.org/topic/56eb698ec95e8f992473c5a3
- 《SSL證書必知必會:數字證書及CA基礎知識》http://liuqunying.blog.51cto.com/3984207/1664246
- 《SSL/TLS協定運作機制的概述》http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
- 《大型網站的 HTTPS 實踐(一)—— HTTPS 協定和原理》http://op.baidu.com/2015/04/https-s01a01/
- 《了解 HTTPS 原理,SSL/TLS 協定》https://hacpai.com/article/1447920990604
- 《HTTPS證書生成原理和部署細節》http://www.barretlee.com/blog/2015/10/05/how-to-build-a-https-server/
- 《HTTPS原理學習筆記》http://www.kevenwu.com/blogs/14/