最近在思考一個關於郵箱伺服器的問題,其中涉及到了SSL/TLS加密傳輸,於是想研究一下什麼,到底是怎麼實現加密的,通過查詢各方面的資料,發現這個涉及到的東西還蠻多的,可以單獨寫一篇文章整理一下自己的理解。
SSL/TLS是什麼?
SSL(安全套接字層)是一種標準安全協議,用於在線上通訊中建立Web伺服器和瀏覽器之間的加密連結。
那TLS又是什麼?Transport Layer Security (TLS)是SSL協議(Secure Sockets Layer)的升級版,TLS 1.0通常被標示為SSL 3.1,TLS 1.1為SSL 3.2,TLS 1.2為SSL 3.3。現在習慣將這個兩個組合在一起稱為SSL/TLS,只要知道它是一種用於加密的安全協議就好了。
當網頁期望使用者提交機密資料(包括個人資訊,密碼或信用卡詳細資訊)時,網頁應使用加密,這個時候web伺服器就應該使用HTTPS協議來傳輸資料,它其實就是HTTP和SSL/TLS結合實現的;同樣的還有SMTPS,它是加密的簡單郵件通訊協議,這樣在傳輸郵件的時候就不是明文傳輸了,一般我們在設定郵箱伺服器的時候可以選擇是否勾選SSL/TLS的,如果沒有勾選的話郵件就是明文傳輸了。
SSL/TLS有什麼作用?
這裡參考了網上的一些觀點: 不使用SSL/TLS的HTTP通訊,就是不加密的通訊。所有資訊明文傳播,帶來了三大風險。
- 竊聽風險(eavesdropping):第三方可以獲知通訊內容。
- 篡改風險(tampering):第三方可以修改通訊內容。
- 冒充風險(pretending):第三方可以冒充他人身份參與通訊。
SSL/TLS協議是為了解決這三大風險而設計的,希望達到
- 所有資訊都是加密傳播,第三方無法竊聽。
- 具有校驗機制,一旦被篡改,通訊雙方會立刻發現。
- 配備身份證書,防止身份被冒充。
SSL證書
先說明一下:SSL/TLS協議的基本思路是採用公鑰加密法,也就是說,客戶端先向伺服器端索要公鑰,然後用公鑰加密資訊,伺服器收到密文後,用自己的私鑰解密。
在講SSL/TLS的工作流程之前,先要說明一下SSL證書這個東西,來思考一個問題: 基本思路里面的公鑰加密法,如何保證公鑰不被篡改?答案是:將公鑰放在數字證書中。只要證書是可信的,公鑰就是可信的。
那SSL證書是什麼?怎麼保證它是可信任的?
SSL 證書就是遵守 SSL協議,由受信任的數字證書頒發機構CA
,在驗證伺服器身份後頒發,具有伺服器身份驗證和資料傳輸加密功能。
怎麼才能申請到SSL證書?或者說影響該證書申請的因素有哪些?
影響證書的因素:申請中提到的企業/公司是否有合法身份以及申請人是否控制證書中提到的域名。
申請到證書的步驟是怎麼樣的?
- 製作CSR檔案 CSR就是Certificate Signing Request證書請求檔案。這個檔案是由申請人制作,在製作的同時,系統會產生2個金鑰,一個是公鑰就是這個CSR檔案,另外一個是私鑰,存放在伺服器上。要製作CSR檔案,申請人可以參考WEB SERVER的文件,一般APACHE等,使用OPENSSL命令列來生成KEY+CSR2個檔案。
- CA認證 域名認證,一般通過對管理員郵箱認證的方式,這種方式認證速度快,但是簽發的證書中沒有企業的名稱; 企業文件認證,需要提供企業的營業執照。一般需要3-5個工作日。 也有需要同時認證以上2種方式的證書,叫EV證書,這種證書可以使IE7以上的瀏覽器位址列變成綠色,所以認證也最嚴格。
- 證書的安裝 在收到CA的證書後,可以將證書部署上伺服器,一般APACHE檔案直接將KEY+CER複製到檔案上,然後修改HTTPD.CONF檔案。
注意:證書分為單域證書、萬用字元證書、多域證書、擴充套件驗證證書,申請證書的時候要看是申請那一類了。
證書在什麼情況下被使用?是怎麼使用的?
- 我們在點選web站點的時候,比如輸入https://www.domain.com ,進行dns解析後web伺服器進行響應,web伺服器自動傳送https://www.domain.com 網站的數字證書給使用者,上文說到了,證書是安裝在web伺服器裡面的,證書裡面含有公鑰,所以這裡相當於伺服器把公鑰傳遞給了客戶端,當然伺服器那裡還有自己的私鑰,具體過程如下圖。
- 客戶端是使用瀏覽器進行操作的,不同版本的瀏覽器自動產生40位或128位的會話金鑰,用於對交易的資訊進行加密,也就是說客戶向伺服器索要公鑰後還要與伺服器協商生成一個“會話祕鑰”。 如下圖,第三步獲取到crt證書後,需要檢驗證書是否有效,如果無效則會顯示警告資訊,有效則生成一個隨機數,即會話金鑰,這個會話金鑰再使用crt裡面的公鑰加密後傳輸給web伺服器,伺服器使用自己的私鑰進行解密,獲取瀏覽器生成的隨機“會話金鑰”,現在客戶端伺服器都知道這個“會話金鑰”了,後續通訊都用這個會話金鑰進行加密通訊了。
SSL是怎麼工作的?
簡單概括就是:
- 客戶端向伺服器端索要並驗證公鑰。
- 雙方協商生成"對話金鑰"。
- 雙方採用"對話金鑰"進行加密通訊。 具體是怎麼協商生成“會話金鑰”的,上文提到了,這裡還有一個疑問,為什麼不直接使用crt證書裡面的公鑰進行加密,再使用伺服器裡面的私鑰進行解密呢?更何況伺服器裡面的私鑰也可以進行加密,crt裡面的證書再進行解密即可。 原因為:每一次對話(session),客戶端和伺服器端都生成一個"會話金鑰"(session key),用它來加密資訊。由於"對話金鑰"是對稱加密,所以運算速度非常快,而伺服器公鑰加密是非對稱加密,比較耗時間,所以證書裡面的公鑰只用於加密"會話金鑰"本身,這樣就減少了加密運算的消耗時間。
那麼會話金鑰和公鑰有什麼區別呢?
- 會話加密是對稱加密,伺服器和客戶端協商後生產一個會話金鑰,所以伺服器和客戶端是共享一個相同的金鑰的,當然不是伺服器和所有客戶端共享一個相同的金鑰,而是每個客戶端都有自己的金鑰,比較這個會話金鑰是客戶端(瀏覽器)隨機生成的,所以伺服器需要維護多個金鑰。
- 公鑰是採用的非對稱加密,伺服器把證書(公鑰)下發給每個使用者正在使用的客戶端(瀏覽器),所以是客戶端共享公鑰,伺服器只掌控私鑰,服務端與客戶端金鑰是一個1對多的關係,客戶端傳送的加密資訊只能服務端解密,安全級別也更高,但是由於非對稱加密太慢了,才採用了不同客戶端不同金鑰的“會話金鑰”來解決這個問題。
具體TLS/SSL裡面涉及到的非對稱加密和對稱加密的區別以及演算法如下圖所示:
總的來說,客戶端(瀏覽器)與web伺服器進入加密通訊,就完全是使用普通的HTTP協議,只不過用"會話金鑰"加密內容,會話金鑰即圖中的隨機數。
結束語
對SSL/TLS涉及到的底層原理做了一個大概的說明,對學習過程中遇到的一些問題做了理解和解答,把一些問題理清楚後,對概念的理解就更加深刻了,比如明白了某個技術的由來背景,為什麼會出現這個東西,問題的初衷是什麼?怎麼實現的?有哪些應用場景,如果把這些都調查清楚,那無論是對這個技術的使用還是新技術的創新都是有好處了,比只會用這個東西來做一些事情侷限於表面工程要好得多,之前聽大佬講,有的人工作了6,7年,比別人剛畢業處理工作1,2年寫出來的文章還要屎,聽後感覺都可怕和悲哀,好好沉澱下去,打好基礎,哪怕是寒冬來了也就不慌了,後續有時間再研究一下SSL證書申請的具體事宜。
- 更多請檢視原文連結: nephen.cn/2018/12/10/…