1. 程式人生 > 其它 >談談網路協議 – HTTPS

談談網路協議 – 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的通訊過程

  • 總的可以分為3大階段
    1. TCP的3次握手
    2. TLS的連線
    3. HTTP請求和響應

TLS 1.2的連線

  • 大概是有10大步驟
  • 圖片中省略了中間產生的一些ACK確認
  • 注意,下圖是 TLS 1.2版本的連線步驟,不同版本,不同的金鑰交換演算法,它的步驟是有所差別的,目的只有一個就是交換各種的金鑰資訊

步驟

  1. Client Hello

    • 客戶端 => 伺服器

    • 它支援的 TLS的版本號

    • 加密元件(Cipher Suite)列表

      • 加密元件是指所使用的加密演算法及金鑰長度等
    • 一個隨機數(Client Random)

  2. Server Hello

    • 伺服器 => 客戶端

    • 選擇的 TLS版本

    • 選擇的 加密元件(Cipher Suite)

      • 是從接收到的客戶端加密元件列表中挑選出來的
    • 一個隨機數(Server Random)

  3. Certificate

    • 伺服器 => 客戶端

    • 伺服器的公鑰證書(被CA簽名過的)

  4. Server Key Exchange

    • 伺服器 => 客戶端

    • 用以實現ECDHE演算法的其中一個引數(Server Params)

      • ECDHE是一種金鑰交換演算法

      • 為了防止偽造,Server Params經過了伺服器私鑰簽名

  5. Server Hello Done

    • 伺服器 => 客戶端

    • 告知客戶端:協商部分結束

    • 目前為止,客戶端和伺服器之間通過明文共享了

      • Client RandomServer RandomServer Params
      • 而且,客戶端也已經拿到了伺服器的公鑰證書,接下來,客戶端會驗證證書的真實有效性
  6. Client Key Exchange

    • 客戶端 => 伺服器

    • 用以實現ECDHE演算法的另一個引數(Client Params

    • 目前為止,客戶端和伺服器都擁有了ECDHE演算法需要的2個引數:Server ParamsClient Params

    • 客戶端、伺服器都可以

      • 使用ECDHE演算法根據Server ParamsClient Params計算出一個新的隨機金鑰串:Pre-master secret
      • 然後結合Client RandomServer RandomPre-master secret 生成一個主金鑰
      • 最後利用主金鑰衍生出其他金鑰:客戶端傳送用的會話金鑰、伺服器傳送用的會話金鑰等
  7. Change Cipher Spec

    • 客戶端 => 伺服器

    • 告知伺服器:之後的通訊會採用計算出來的會話金鑰進行加密

  8. Finished

    • 客戶端 => 伺服器

    • 包含連線至今全部報文的整體校驗值(摘要),加密之後傳送給伺服器

    • 這次握手協商是否成功,要以伺服器是否能夠正確解密該報文作為判定標準

  9. Change Cipher Spec

    • 伺服器 => 客戶端

    • 告知客戶端:之後的通訊會採用計算出來的會話金鑰進行加密

  10. 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/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。
我的聯絡方式: