0. 簡單回顧
在前面兩篇博客中介紹了密碼相關的一些基本工具,包括(對稱密碼,公鑰密碼,密碼散列函數,混合密碼系統,消息認證碼碼,數字簽名,偽隨機數,數字證書)這幾個。其中它們之間也是互相依賴的,我們來簡單的梳理一下它們的依賴關系。
- 對稱密碼:無。
- 公鑰密碼:無。
- 密碼散列函數:無。
- 偽隨機數:可以利用密碼散列函數來實現,也可以不使用。
- 混合密碼系統:對稱密碼 + 公鑰密碼 + 密碼散列函數。
- 消息認證碼:密碼散列函數 + 對稱密碼。
- 數字簽名:密碼散列函數 + 公鑰密碼。
- 數字證書:公鑰密碼 + 數字簽名。
這篇要介紹的HTTPS,則把以上這些全都派上場了。
1. HTTPS 簡史
在早期HTTP誕生的這幾年間,1990年~·1994年,HTTP作為一個應用層協議,它是這樣工作的:
后來網景公司開發了SSL(Secure Sockets Layer)技術,然后它就變成了這樣的HTTP,也就是HTTPS了:
后來爆發了與IE的世紀大戰,網景敗北,SSL移交給了IETF(Internat Engineering Task Force)互聯網工程任務組,標准化之后變成了現在的TLS,現在一般會把它們兩個放在一起稱為SSL/TLS。本篇並不關注SSL/TLS具體是如何工作的,只是抽象的解釋下HTTPS的一個工作流程。
2. HTTPS 工作流程
- Client發起一個HTTPS(https:/demo.linianhui.dev)的請求,根據RFC2818的規定,Client知道需要連接Server的443(默認)端口。
- Server把事先配置好的公鑰證書(public key certificate)返回給客戶端。
- Client驗證公鑰證書:比如是否在有效期內,證書的用途是不是匹配Client請求的站點,是不是在CRL吊銷列表里面,它的上一級證書是否有效,這是一個遞歸的過程,直到驗證到根證書(操作系統內置的Root證書或者Client內置的Root證書)。如果驗證通過則繼續,不通過則顯示警告信息。
- Client使用偽隨機數生成器生成加密所使用的會話密鑰,然后用證書的公鑰加密這個會話密鑰,發給Server。
- Server使用自己的私鑰(private key)解密這個消息,得到會話密鑰。至此,Client和Server雙方都持有了相同的會話密鑰。
- Server使用會話密鑰加密“明文內容A”,發送給Client。
- Client使用會話密鑰解密響應的密文,得到“明文內容A”。
- Client再次發起HTTPS的請求,使用會話密鑰加密請求的“明文內容B”,然后Server使用會話密鑰解密密文,得到“明文內容B”。
簡單總結下,HTTPS是使用了證書的一個混合密碼系統,其中證書的作用在於傳遞會話密鑰,以及驗證網站的真實性;而HTTPS真正的加密操作是由對稱密碼這個工具負責的(有興趣的可以找找每個步驟中都用到了密碼工具箱中的那些工具)。在windows系統中,可以配置一個名為 SSLKEYLOGFILE 的環境變量,Chrome和Firefox在訪問HTTPS站點的時候,會把第4步生成的會話密鑰以及其他附屬信息,寫入到這個文件中:
比如下圖:
具體的格式可以參考MDN的一個說明https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/Key_Log_Format。
以上只是一個抽象的HTTPS的一個工作流程,實際上SSL/TLS所做的工作遠不止這這些,更詳細的解釋請參考這篇文章:http://www.infoq.com/cn/articles/HTTPS-Connection-Jeff-Moser。
如有錯誤之處,歡迎指正!
3. 參考
SSL/TLS:https://en.wikipedia.org/wiki/Transport_Layer_Security
IETF:https://en.wikipedia.org/wiki/Internet_Engineering_Task_Force
HTTPS:https://en.wikipedia.org/wiki/HTTPS
HTTPS 連接最初的若干毫秒:http://www.infoq.com/cn/articles/HTTPS-Connection-Jeff-Moser
HTTPS on Stack Overflow: The End of a Long Road:https://nickcraver.com/blog/2017/05/22/https-on-stack-overflow/
SSL/TLS部署最佳實踐:https://github.com/ssllabs/research/wiki/SSL-and-TLS-Deployment-Best-Practices
HTTP Over TLS:https://tools.ietf.org/html/rfc2818
SSLKEYLOGFILE:https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/Key_Log_Format