週末在公司遇到了因為裝在Linux機器的SSL Certificate 過期所以導致客戶無法進入到公司SSO登錄頁面的case( 因為CloudWatch也把Certificate Issue擋掉),所以緊急更換SSL Certificate,但也讓我突然間好奇起來究竟https是如何透過Certificate來交換ClientServer之間的訊息的呢?

  於是上網查找了一下資料,發現下圖最能一目瞭然https交換訊息的原理:

[Ref] https://read01.com/yj3B.html

但這個其實只是ClientServer之間建立https交換通道的交握過程,事實上在經過這一交握階段之後,ClientServer端之間將只透過對稱加密互相交換訊息,不會再透過複雜的非對稱加密協定以及Hash機制來進行訊息交換,因為效率太差,也可以想像https是在交握過程驗證彼此身份以及使用的加密協定,然後進入交換訊息的對話階段,雙方只需按照講好的方式交換訊息,就不用再彼此進行驗證,以提升效率。所以整個HTTPS溝通過程可以分成兩個階段:

  在這邊說明一下SSL協定的版本進展:SSL 1.0 -> SSL2.0 -> SSL 3.0 -> TLS 1.0(SSL 3.1) -> TLS 1.1(SSL 3.2) -> TLS 1.2 (SSL 3.3) . 目前大部份主流Browser都已支援TLS 1.2 ,而TLS 1.0 則是最被廣為使用的協定。

  HTTPS便是建立在SSL/TLS基礎之上的HTTP通信,目的是達成HTTP訊息交換時保證:(1).訊息不被竊取-對稱加密 (2).訊息不會被篡改-Hash (3).通信雙方不被冒充- Certificate

  ClientHello : 首先Client會向Server端送出一個ClientHello訊息,告訴Server端自己支援的對稱與非對稱加密方法以及Hash演算法,並告知自己使用的SSL/TLS協議。

  ServerHello: Server收到ClientHello之後,選出適當的加密及Hash方法,並且將本身的certficate public key( Certificate = Public Key + Private Key)以及頒發機構、到期日等憑證內容資訊一起回傳給Client

  Client Session Key: Client收到ServerHello之後,先Verify Server Certificate是否有效,若有效Client端將產生一把Random Key (Session Key) 並用Server Certificate public key來加密Random key,然後回傳Encrypted Random Key以及將Random key hash之後的內容給Server

  Server Session Key: Server會收到Client的訊息,然後用本身的certificate private key解密Encrypted Random key出來,然後用Random keyhash訊息並跟client message一起被傳過來的hash 值比較,若無差異則表示訊息未被竄改,也就是說這把Random Key確實是Client端產生的,將在交握階段完成之前後被用來對雙方訊息作對稱加解密用。 確定Random Key (Session Key) 之後,Server會用Random Key加密訊息並且Hash這一段加密前的訊息再回傳給Client

  Client 收到Server端的訊息,先用Session Key解密訊息,再將該明文訊息用與Server協調過的Hash演算法產生特徵值以跟隨Server端一起傳過來的Hash值作比較,若Hash值沒有差異,交握階段便結束,此後雙方只要透過Session KeyHash對訊息加解密以及比對hash便可以安全溝通不怕被第三方竊取訊息。

  下圖是另一更為清楚的HTTPS交握階段流程圖:

[Ref] http://blog.csdn.net/clh604/article/details/22179907

 

HTTPS交握階段完成後,ClientServer之間便用以下對話階段的方式來溝通HTTP訊息:

 

[Reference]

  1. https原理:证书传递、验证和数据加密、解密过程解析, http://blog.csdn.net/clh604/article/details/22179907
  2. 简单粗暴系列之HTTPS原理, http://www.jianshu.com/p/650ad90bf563
  3. HTTPS(SSL/TLS) 原理之深入淺出, https://read01.com/yj3B.html
arrow
arrow

    jackterrylau 發表在 痞客邦 留言(0) 人氣()