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