https、ssl、tls協議學習
一、知識準備
1.ssl協議:通過認證、數字簽名確保完整性;使用加密確保私密性;確保客戶端和伺服器之間的通訊安全
2.tls協議:在SSL的基礎上新增了諸多的功能,它們之間協議工作方式一樣
3.https協議:https over tls,tls協議是https協議的核心
名詞介紹:
CA:Certificate Authority,也稱為電子商務認證中心,是負責發放和管理數字證書的權威機構
對稱加密:加密和解密使用相同金鑰的加密演算法。它的速度快,通常在加密大量資料時使用
非對稱加密:需要兩個金鑰來進行加密和解密,公鑰與私鑰。公鑰加密的只能用私鑰解密,反之私鑰加密的也只能用公鑰解密。通常用於重要資訊的安全傳輸,缺點是速度比對稱加密慢很多
二、tls通訊過程
廢話不說,我們先上tls通訊過程
(1)客戶端-->服務端:協商協議版本、加密方案、壓縮方法等;生成一個隨機數,用於之後生成會話祕鑰
(2)服務端-->客戶端:確認協商資訊;生成一個隨機數,用於之後生成會話祕鑰;傳送證書到客戶端
(3)客戶端-->服務端:生成一個隨機數,用於之後生成會話祕鑰;驗證自己收到的證書是否為合法的證書;若證書沒問題,則會從證書中取出公鑰,加密最後一個隨機數傳送給服務端;然後使用產生的3個隨機數生成會話祕鑰,並且宣佈用會話祕鑰來進行加密通訊(會話祕鑰是對稱加密)
(4)服務端:收到被公鑰加密的最後的隨機數,然後用私鑰解開之後再加上之前的2個隨機數,產生會話祕鑰
(5)至此,雙方都已經擁有會話祕鑰,並且用該會話祕鑰進行隨後的加密通訊
這就是整個通訊過程,本文結束了嗎?顯然沒有,我們還有幾個問題沒有解決
三、tls通訊中需要解決的問題
(a)客戶端從服務端收到的證書,是真實的證書,還是黑客偽裝的證書
(b)私鑰是不能公佈的,公鑰是釋出出去大家都知道的,那用什麼祕鑰去加密
下面我們來一一解決這些問題:
問題(a)
要說清楚客戶端怎麼驗證證書,要先弄明白證書是什麼
● 證書內容:如發行機構、有效期、公司資訊等 ● 摘要:證書內容等經過hash之後生成摘要 ● 數字簽名:CA使用私鑰對摘要,加密之後生成簽名 ● 數字證書主要由證書內容、公鑰、數字簽名、使用的hash演算法等組成
證書驗證分為真實性驗證與有效性驗證:
真實性驗證:
● 通過內建根證書的公鑰對數字簽名解密,得到一個hash值,這個hash值就是摘要
● 使用證書內的hash演算法將證書內容進行hash之後得到一個hash值,用這個新的hash值與上一步的hash值進行對比
● 若相同,證明證書真實有效,若不同,則證明被串改過
有效性驗證:
● CRL。CA會提供一份證書失效名單,瀏覽器會快取並定期更新該名單。
● OCSP。CA提供實時介面查詢
還有個問題需要解釋一下:
關於數字簽名中,CA使用的私鑰的問題
● CA也會生成一對私鑰、公鑰,私鑰對使用者證書進行加密
● 而公鑰會內建在作業系統的安裝當中成為系統預設的根證書
● 在真實性驗證中,客戶端使用內建根證書中的公鑰對使用者的證書進行解密
至此,關於證書驗證的問題大致描述到此
問題(b)
完成證書驗證之後
● 在tls通訊過程中(1)、(2)分別生成了2個隨機數,這兩個隨機數是沒有加密傳遞
● 在tls通訊過程中(3)又生成了1個隨機數,這個隨機數會被公鑰加密之後,只能被服務端的私鑰解密
● 所以,第三個隨機數是安全的,沒有被洩露的,通過這3個隨機數使用對稱加密演算法生成會話祕鑰
● 之後的資料傳輸都會使用會話祕鑰進行加密
● 由於會話祕鑰是對稱加密,它的加密解密速度都大大超過非對稱祕鑰
四、自籤根證書測試
自籤根證書的帖子網上的大神很多,我就不班門弄斧了
經過一頓猛如虎的操作之後,我手裡面拿到了這幾個檔案:
[email protected]:/opt/CA/certs# ls -l
total 20
-rw-r--r-- 1 root root 1448 Oct 26 10:14 ca.crt
-rw------- 1 root root 1854 Oct 26 10:14 ca.key
-rw-r--r-- 1 root root 4493 Oct 26 10:14 server.crt
-rw------- 1 root root 1675 Oct 26 10:14 server.key
ca.crt:自籤的根證書
ca.key:根證書對應的私鑰
server.crt:伺服器證書
server.key:伺服器證書對應的私鑰
我們部署一個nginx,並且配置ssl
server {
listen 443 ssl;
server_name www.mrvolleyball.com;
ssl_certificate /etc/nginx/cert/server.crt;
ssl_certificate_key /etc/nginx/cert/server.key;
location / {
root html;
}
}
首先來訪問一下nginx:
不出所料,證書是不受信任的,接下來我們在系統中信任自籤的根證書
再次開啟
至此,本文結束
在下才疏學淺,有撒湯漏水的,請各位不吝賜教...