談談網路協議 – HTTPS
HTTPS
- HTTPS(HyperText Transfer Protocol Secure),譯為:超文字傳輸安全協議
- 常稱為HTTP over TLS、HTTP over SSL、HTTP Secure
- 由網景公司於1994年首次提出
- HTTPS的預設埠號是443(HTTP是80)
- 現在在瀏覽器上輸入http://www.baidu.com
- 會自動重定向到https://www.baidu.com
SSL/TLS
- HTTPS是在HTTP的基礎上使用SSL/TLS來加密報文,對竊聽和中間人攻擊提供合理的防護
- SSL/TLS也可以用在其他協議上,比如
- FTP → FTPS
- SMTP → SMTPS
-
TLS(Transport Layer Security),譯為:傳輸層安全性協議
-
前身是SSL(Secure Sockets Layer),譯為:安全套接層
-
歷史版本資訊
- SSL 1.0:因存在嚴重的安全漏洞,從未公開過
- SSL 2.0:1995年,已於2011年棄用(RFC 6176)
- SSL 3.0:1996年,已於2015年棄用(RFC 7568)
- TLS 1.0:1999年(RFC 2246)
- TLS 1.1:2006年(RFC 4346)
- TLS 1.2:2008年(RFC 5246)
- TLS 1.3:2018年(RFC 8446)
- 有沒有發現:TLS的RFC文件編號都是以46結尾
SSL/TLS - 工作在哪一層
OpenSSL
- OpenSSL是SSL/TLS協議的開源實現,始於1998年,支援Windows、Mac、Linux等平臺
- Linux、Mac一般自帶OpenSSL
- Windows下載安裝OpenSSL:https://slproweb.com/products/Win32OpenSSL.html
- 常用命令
- 生成私鑰:openssl genrsa -out mj.key
- 生成公鑰:openssl rsa -in mj.key -pubout -out mj.pem
- 可以使用OpenSSL構建一套屬於自己的CA,自己給自己頒發證書,稱為“自簽名證書”
HTTPS的成本
- 證書的費用
- 加解密計算
- 降低了訪問速度
- 有些企業的做法是:包含敏感資料的請求才使用HTTPS,其他保持使用HTTP
HTTPS的通訊過程
- 總的可以分為3大階段
- TCP的3次握手
- TLS的連線
- HTTP請求和響應
TLS 1.2的連線
- 大概是有10大步驟
- 圖片中省略了中間產生的一些ACK確認
- 注意,下圖是 TLS 1.2版本的連線步驟,不同版本,不同的金鑰交換演算法,它的步驟是有所差別的,目的只有一個就是交換各種的金鑰資訊
步驟
-
Client Hello
-
客戶端 => 伺服器
-
它支援的 TLS的版本號
-
加密元件(Cipher Suite)列表
- 加密元件是指所使用的加密演算法及金鑰長度等
-
一個隨機數(Client Random)
-
-
Server Hello
-
伺服器 => 客戶端
-
選擇的 TLS版本
-
選擇的 加密元件(Cipher Suite)
- 是從接收到的客戶端加密元件列表中挑選出來的
-
一個隨機數(Server Random)
-
-
Certificate
-
伺服器 => 客戶端
-
伺服器的公鑰證書(被CA簽名過的)
-
-
Server Key Exchange
-
伺服器 => 客戶端
-
用以實現ECDHE演算法的其中一個引數(Server Params)
-
ECDHE是一種金鑰交換演算法
-
為了防止偽造,Server Params經過了伺服器私鑰簽名
-
-
-
Server Hello Done
-
伺服器 => 客戶端
-
告知客戶端:協商部分結束
-
目前為止,客戶端和伺服器之間通過明文共享了
- Client Random、Server Random、Server Params
- 而且,客戶端也已經拿到了伺服器的公鑰證書,接下來,客戶端會驗證證書的真實有效性
-
-
Client Key Exchange
-
客戶端 => 伺服器
-
用以實現ECDHE演算法的另一個引數(Client Params)
-
目前為止,客戶端和伺服器都擁有了ECDHE演算法需要的2個引數:Server Params、Client Params
-
客戶端、伺服器都可以
- 使用ECDHE演算法根據Server Params、Client Params計算出一個新的隨機金鑰串:Pre-master secret
- 然後結合Client Random、Server Random、Pre-master secret 生成一個主金鑰
- 最後利用主金鑰衍生出其他金鑰:客戶端傳送用的會話金鑰、伺服器傳送用的會話金鑰等
-
-
Change Cipher Spec
-
客戶端 => 伺服器
-
告知伺服器:之後的通訊會採用計算出來的會話金鑰進行加密
-
-
Finished
-
客戶端 => 伺服器
-
包含連線至今全部報文的整體校驗值(摘要),加密之後傳送給伺服器
-
這次握手協商是否成功,要以伺服器是否能夠正確解密該報文作為判定標準
-
-
Change Cipher Spec
-
伺服器 => 客戶端
-
告知客戶端:之後的通訊會採用計算出來的會話金鑰進行加密
-
-
Finished
- 伺服器 => 客戶端
- 到此為止,客戶端伺服器都驗證加密解密沒問題,握手正式結束
- 後面開始傳輸加密的HTTP請求和響應
Wireshark解密HTTPS
-
設定環境變數SSLKEYLOGFILE(瀏覽器會將key資訊匯出到這個檔案)
-
設定完成後,最好重啟一下作業系統
-
在Wireshark中選擇這個檔案
-
編輯 → 首選項 → Protocols → TLS
-
-
如果環境變數不管用,可以直接設定瀏覽器的啟動引數
- --ssl-key-log-file=F:\log\ssl.log
配置伺服器HTTPS
生成證書
- 環境:Tomcat9.0.34、JDK1.8.0_251
- 首先,使用JDK自帶的keytool生成證書(一個生成免費證書的網站: https://freessl.org/)
- keytool -genkeypair -alias test -keyalg RSA -keystore F:/test.jks
配置Tomcat
- 將證書*.jks檔案放到TOMCAT_HOME/conf目錄下
- 修改TOMCAT_HOME/conf/server.xml中的Connector
作者:悠悠清風
出處:https://www.ywgao.cn/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。
我的聯絡方式:[email protected]