談談網絡協議 – HTTPS


HTTPS

  • HTTPS(HyperText Transfer Protocol Secure),譯為:超文本傳輸安全協議
    • 常稱為HTTP over TLS、HTTP over SSL、HTTP Secure
    • 由網景公司於1994年首次提出
  • HTTPS的默認端口號是443(HTTP是80)

image-20210406175226767

  • 現在在瀏覽器上輸入http://www.baidu.com
    • 會自動重定向到https://www.baidu.com

SSL/TLS

  • HTTPS是在HTTP的基礎上使用SSL/TLS來加密報文,對竊聽和中間人攻擊提供合理的防護
  • SSL/TLS也可以用在其他協議上,比如
    • FTP → FTPS
    • SMTP → SMTPS

image-20210406175401998

image-20210406175413010

  • 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 - 工作在哪一層

image-20210406181755478

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請求和響應

image-20210406182101515

TLS 1.2的連接

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

image-20210406182206986

步驟

  1. Client Hello

    • 客戶端 => 服務器

    • 它支持的 TLS的版本號

    • 加密組件(Cipher Suite)列表

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

      image-20210407095702237

  2. Server Hello

    • 服務器 => 客戶端

    • 選擇的 TLS版本

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

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

      image-20210407100610886

  3. Certificate

    • 服務器 => 客戶端

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

      image-20210407101011259

  4. Server Key Exchange

    • 服務器 => 客戶端

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

      • ECDHE是一種密鑰交換算法

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

        image-20210407101351072

  5. Server Hello Done

    • 服務器 => 客戶端

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

      image-20210407101454717

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

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

    • 客戶端 => 服務器

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

      image-20210407101806481

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

    • 客戶端、服務器都可以

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

    • 客戶端 => 服務器

    • 告知服務器:之后的通信會采用計算出來的會話密鑰進行加密

      image-20210407102210163

  8. Finished

    • 客戶端 => 服務器

    • 包含連接至今全部報文的整體校驗值(摘要),加密之后發送給服務器

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

      image-20210407102334265

  9. Change Cipher Spec

    • 服務器 => 客戶端

    • 告知客戶端:之后的通信會采用計算出來的會話密鑰進行加密

      image-20210407102600623

  10. Finished

    • 服務器 => 客戶端
    • 到此為止,客戶端服務器都驗證加密解密沒問題,握手正式結束
    • 后面開始傳輸加密的HTTP請求和響應

    image-20210407102643266

Wireshark解密HTTPS

  • 設置環境變量SSLKEYLOGFILE(瀏覽器會將key信息導出到這個文件)

    image-20210407104529965

  • 設置完成后,最好重啟一下操作系統

  • 在Wireshark中選擇這個文件

    • 編輯 → 首選項 → Protocols → TLS

      image-20210407104559246

  • 如果環境變量不管用,可以直接設置瀏覽器的啟動參數

    • --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

image-20210407104927944


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM