SSL/TLS 連接的創建/握手

<table class="d-block"> <tbody class="d-block"> <tr class="d-block"> <td class="d-block comment-body markdown-body js-comment-body">git

<p>HTTPS 即 HTTP-within-SSL/TLS,其中 SSL/TLS 又分別表示:</p> <ul> <li>SSL:Secure Sockets Layer</li> <li>TLS:Transport Layer Security</li> </ul> <p>SSL/TLS 創建連接及握手的過程爲:</p> <p><a target="_blank" rel="noopener noreferrer" href="https://user-images.githubusercontent.com/3783096/59965876-6cf8ba00-9546-11e9-8fc3-bf3656afe095.png"><img src="https://user-images.githubusercontent.com/3783096/59965876-6cf8ba00-9546-11e9-8fc3-bf3656afe095.png" alt="SSL/TLS 創建連接及握手的示意圖" style="max-width:100%;"></a></p> <p align="center">SSL/TLS 創建連接及握手的示意圖</p> <h3>階段一</h3> <ul> <li>Client Hello <ul> <li>客戶端向服務器發送 <ul> <li>隨機數 Random1</li> <li>客戶端支持的加密套件 Support Ciphers</li> <li>SSL 版本</li> </ul> </li> </ul> </li> <li>Server Hello <ul> <li>服務器向客戶端發送</li> <li>從客戶端發送加密套件列表中選擇一個,加密套件決定了後續加密及生成摘要的算法</li> <li>生成隨機數Random2。兩端的隨機數會在後續生成對稱密鑰時使用。</li> </ul> </li> </ul> <h3>階段二</h3> <ul> <li>Certificate <ul> <li>服務器將本身的證書下發給客戶端,讓客戶端驗證服務器的身份。( 12306 曾經使用國內本身簽發的證書,結果 Chrome 不認就是這個道理)</li> <li>客戶端驗證後從證書取出公鑰</li> </ul> </li> <li>Server Key Exchange <ul> <li>DH 算法須要此步驟,發送服務器使用的 DH參數,RSA 不須要</li> </ul> </li> <li>Certificate Request <ul> <li>可選。服務器要求客戶端上報證書。對安全性要求極高時使用。</li> </ul> </li> <li>Server Hello Done <ul> <li>通知客戶端 Server Hello 結束</li> </ul> </li> </ul> <h3>階段三</h3> <ul> <li> <p>Certificate Verify</p> <ul> <li>客戶端收到證書後從CA驗證其合法性。</li> <li>驗證合法後從證書取出公鑰,生成隨機數 Random3</li> <li>使用公鑰非對稱加密Random3 生成 PreMaster Key</li> </ul> </li> <li> <p>Client Key Exchange</p> <ul> <li>客戶端將 PreMaster Key 發送服務器,服務器用本身的私鑰解出 Random3。</li> <li>此時兩端都擁有 Random 1~3</li> <li>兩端使用相同的算法生成密鑰,握手結束後的數據傳輸都使用此密鑰進行對稱加密。</li> </ul> </li> <li> <p>爲什麼須要三個隨機數?</p> <ul> <li>由於SSL/TSL 握手過程數據明文傳輸,多個隨機數種子生成的密鑰不容易暴力破解。</li> </ul> </li> </ul> <h3>階段四</h3> <ul> <li>Change Cipher Spec (Client) <ul> <li>這是一條事件消息</li> <li>客戶端通知服務端後續消息都會使用前面協商出來的密鑰加密。</li> </ul> </li> <li>Encrypted Handshake Message (Client) <ul> <li>這是條 Client Finish 消息 <ul> <li>客戶端將前面的握手消息生成摘要,使用前面協商的密鑰加密。</li> </ul> </li> <li>這是客戶端發出的第一條加密消息</li> <li>服務端使用密鑰解密,解密成功說明密鑰一致。</li> </ul> </li> <li>Change Cipher Spec (Server) <ul> <li>事件消息</li> <li>服務端通知客戶端後續消息都使用加密。</li> </ul> </li> <li>Encrypted Handshake Message (Server) <ul> <li>Server Finish 消息</li> <li>服務端將握手過程生成摘要</li> <li>使用密鑰加密發送給客戶端</li> <li>這是服務端發送的第一條加密消息</li> <li>客戶端收到後解密,成功說明密鑰一致。</li> </ul> </li> </ul> <h2>相關資源</h2> <ul> <li><a href="https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_7.1.0/com.ibm.mq.doc/sy10660_.htm" rel="nofollow">An overview of the SSL or TLS handshake</a></li> <li><a href="https://www.acunetix.com/blog/articles/establishing-tls-ssl-connection-part-5/" rel="nofollow">TLS Security 5: Establishing a TLS Connection</a></li> <li><a href="https://www.jianshu.com/p/7158568e4867" rel="nofollow">SSL/TLS 握手過程詳解</a></li> </ul> </td> </tr> </tbody> </table>github

相關文章
相關標籤/搜索