HTTPS工作流程

  • 2020 年 4 月 19 日
  • 筆記

HTTPS工作流程

RSA演算法

RSA的密鑰分成兩個部分:

  • PublicKey
    • 加密數據
    • 驗證簽名
    • 不能解密
    • 任何人都可以獲得
  • Private Key
    • 數據簽名(摘要演算法)
    • 解密
    • 加密(不用此功能)
    • 不公開

RSA演算法的特點:

  • 公鑰端到私鑰端的通訊卻是安全的
    • 因為只有私鑰能解密
  • 無法解決公鑰端資訊可信的問題
    • 任何人都可以拿到公鑰給私鑰端發資訊
  • 私鑰端給公鑰端回消息不安全
    • 私鑰發的消息公鑰可解密,任何人都可看到
    • 私鑰回的消息可以簽名,保證無法被篡改

適合場景:

  • 發消息的消息要求絕對安全
  • 回消息要求不被篡改,但是被別人看到也無所謂

生產應用時希望通訊雙方的所有數據都是加密的,並且都雙方都可以解密,這種時候使用對稱加密,雙方都配置好密鑰就好了;如果非要使用RSA,那隻利用RSA發消息加密的特點,那麼有兩種方式:

方式一:兩對RSA密鑰

  • 思路:兩對RSA密鑰,發消息時都用對方的公鑰。

  • 準備:雙方各生成一對公鑰和私鑰,並把公鑰給對方。

  • 發消息:用對方的公鑰把消息加密發給對方。

  • 收消息:用自己的私鑰解密消息。

  • 回消息:類似發消息,用對方的公鑰發送加密消息。

如果在Client-Server模型應用中使用這種方式步驟為:

  • 服務端開放自己的公鑰
    • 客戶端發送消息給服務端用服務端的公鑰
  • 客戶端生成自己公鑰和私鑰,並把自己的公鑰發給服務端
    • 服務端回消息時候用客戶端的私鑰加密

這種方式是ssh免密登陸的實現,客戶端接受服務端的公鑰放到 ~/.ssh/known_hosts,客戶端再把自己的公鑰配置到服務端,這樣就實現了雙向加密通訊。

方式二:RSA+對稱加密

  • 思路:公鑰端發消息時候,對消息再進行一次對稱加密並把密碼發給私鑰,後續對稱加密通訊

  • 發消息:公鑰端把數據對稱加密,然後把加密結果和對稱加密的密鑰用公鑰加密,一起發給私鑰端

  • 收消息:私鑰解密後拿到對稱密鑰和報文,再對報文解密得到明文

  • 回消息:回消息只對稱加密數據然後簽名,公鑰端先驗簽再用公鑰解密

方式二https協議使用方案,也是ssh協議非免密的實現方案。

HTTPS協議

http是應用層協議,在tcp協議之上。這兩個協議傳輸的都是明文,tcp之上再加一層安全協議SSL(Security Socket Layer) ,基於這一層實現http得到的就是https。

SSL是安全套接字編程介面,後來又進化為TLS(Transport Layer Security)傳輸層安全,定位類似,都是給TCP協議加密的。不管SSL和TLS都是軟體實現的協議,在TCP/IP 4層模型中,它們也是應用層的。

在上一章,我們知道https同時利用了rsa和對稱加密方法,通訊流程為:

  • 步驟1:客戶端請求服務端的證書

    • 這一步被攔截、篡改了也沒問題,因為只是通訊前的準備工作
  • 步驟2:服務端給客戶端發送證書

    • 客戶端收到證書後驗真,如果OK就有服務端的公鑰了
    • 證書是公開的,被攔截了也沒問題
    • 如果被篡改成假證書,並且客戶端驗證通過就不安全了
      • 客戶端用假證書的公鑰加密數據,然後發送加密數據也被攔截就破解了https
      • 證書必須由專業結構發放
        • 發放機構對證書負責
        • 如果使用假證書破解就可以找到假證書的主人
  • 步驟3:客戶端生成對稱密鑰並用公鑰發送給服務端

    • 客戶端自己記錄下來生成的密鑰
  • 步驟4:服務端解析出對稱密鑰並存儲

  • 步驟5:客戶端使用對稱密鑰加密數據發送

  • 步驟6:服務端使用對稱密鑰解密數據,並把響應數據用對稱密鑰加密

rsa的主要作用:

  • 客戶端與伺服器之間約定對稱密鑰

對稱加密的作用:

  • http報文安全傳輸

SSL證書包含的資訊:

  • 證書的發布機構CA(Certificate Authoritie)
  • 證書的有效期
  • 公鑰
  • 證書所有者
  • 簽名

證書最主要的作用就是存儲伺服器的公鑰,並且保證伺服器的的公鑰是安全有效的,整個https安全的核心也是基於證書發放機構絕對安全。如果客戶端拿著一個假的證書用了一個假的rsa 公鑰,並且加密了發送,那這個假的公鑰所對應的私鑰就可以解密數據了。證書的真假只有靠證書的發放結構去驗證,選擇一家靠譜的發布機構很重要。

使用

服務端

因為服務端要接受並解密數據,服務端要有rsa的公鑰和私鑰,對稱加密的密鑰是客戶端動態生成的,所以我們生成一對密鑰然後放到一個支援https的伺服器上就完成了部署。

具體操作請參考 :

//aotu.io/notes/2016/08/16/nginx-https/index.html

客戶端

客戶端要有接受服務端證書並驗證證書的能力,但是如果我們的網路是內網部署就沒法驗證服務端發送過來的證書了。那可以預先把證書放到客戶端,如果伺服器發來的證書是我們信任的,那麼就可以給它發對稱密鑰並通訊。

具體操作請參考:

//www.cnblogs.com/duanxz/p/5146340.html

參考

HTTPS系列乾貨(一):HTTPS 原理詳解

RSA加密、解密、簽名、驗簽的原理及方法

SSH協議(1)-工作原理及過程