主頁 > 軟體設計 > SSL協議原理

SSL協議原理

2021-03-07 15:08:54 軟體設計

文章目錄

  • SSL協議原理
    • SSL協議結構
    • SSL原理(握手協議)
      • SSL握手協議第一階段
        • 客戶端Client Hello資料包
        • 服務端server Hello資料包
      • SSL握手協議第二階段
        • **Certificate訊息資料包**
        • Server Key Exchange訊息資料包
        • ServerHello Done資料包
      • SSL握手協議第三階段
        • Client Key exchange資料包
      • SSL握手協議第四階段
    • SSL會話恢復
    • SSL原理(記錄協議)

SSL協議原理

SSL(Security Socket Layer)是一個安全協議,為基于TCP的應用層協議提供安全連接,SSL介于TCP/IP協議堆疊第四層和第七層之間,SSL可以為HTTP協議提供安全例案件,SSL為網路上資料的傳輸提供安全性保障,

SSL協議結構

在這里插入圖片描述

SSL協議結構分為兩層:

  • 底層為SSL記錄協議(SSL record protocol)

    • 主要負責對上層資料進行分塊、壓縮、計算并添加MAC(Message Authenticate Code ,散列演算法計算訊息認證代碼)、加密,最后把記錄塊傳輸給對方
  • 上層:SSL握手協議(SSLhandshake protocol)、SSL密碼變化協議(SSL change cipher spec protocol)、SSL警告協議(SSL alert protocol)

    • SSL握手協議:客戶端和服務器通過握手協議建立一個會話,會話包含一組引數,主要有會話ID、對方的證書、加密演算法串列(包括密鑰交換演算法、資料加密演算法和MAC演算法)、壓縮演算法以及主密鑰,SSL會話可以被多個連接共享,以減少會話協商開銷,
    • SSL密碼變化協議:客戶端和服務器端通過密碼變化協議通知接收方,隨后的報文都將使用新協商的加密演算法串列和密鑰進行保護和傳輸,
    • SSL警告協議:用來允許一方向另一方報告告警資訊,訊息中包含告警的嚴重級別和描述,

SSL原理(握手協議)

在這里插入圖片描述
通過SSL握手協議協商資料傳輸中要用到的相關安全引數,并對對端的身份進行驗證,

SSL握手協議第一階段

在這里插入圖片描述

客戶端發送一個ClientHello訊息,包含引數

  • 版本:訊息中協議版本是兩個byte長度分別表示主次版本,目前SSL擁有的版本有SSLv1、SSLv2、 SSLv3以及TSLv1 (即SSLv3.1 ),
  • 亂數: 32位時間戳+28位元組隨機序列,用于在后面計算所有訊息的摘要或計算主密鑰,
  • 會話ID: SSL會 話ID標識一次會話用,可以重用,
  • 客戶端支持的密碼演算法串列( CipherSuite) :密鑰套件串列,串列中包含了Client端支持的所有密鑰套件,
  • 客戶端支持的壓縮方法串列:客戶端支持的壓縮演算法串列,填0表示空,

當服務器收到包含以上資訊的ClientHello訊息后,服務器發送ServerHello訊息,包括引數

  • 版本:服務器拿出ClientHello訊息中的版本號,再看看自己支持的版本串列,選擇兩者都支持的最高版本號定為這次協商出來的SSL協議使用的版本,
  • 服務器產生的亂數:此處產生的亂數與ClientHello訊息中的類似,
  • 會話ID:服務器端檢測到傳過來的Session ID 是慷訓者檢索Session串列沒有發現傳過來的Session ID就會新建一個,

服務器從客戶端建議的密碼演算法中挑出一套(CipherSuite)密碼演算法

服務器從客戶端建議的壓縮方法中挑出一個壓縮演算法

客戶端Client Hello資料包

在這里插入圖片描述

服務端server Hello資料包

在這里插入圖片描述

SSL握手協議第二階段

在這里插入圖片描述

Certificate訊息( 可選)

一般情況下,除了會話恢復時不需要發送該訊息,在SSL握手的全流程中,都需要包含該訊息,訊息包含一個X.509證書,證書中包含公鑰,發給客戶端用來驗證簽名或在密鑰交換的時候給訊息加密,

服務端將自己的證書下發給客戶端,讓客戶端驗證自己的身份,客戶端驗證通過后取出證書中的公鑰,

Server Key Exchange (可選)

根據之前在ClientHello訊息中包含的CipherSuite資訊,決定了密鑰交換方式(例如RSA或者DH),因此在Server Key Exchange消 息中便會包含完成密鑰交換所需的一系列引數,

Certificate Request (可選)

服務器端發出CertificateRequest訊息,要求客戶端發他自己的證書過來進行驗證,該訊息中包含服務器端支持的證書型別(RSA、DSA、ECDSA等)和服務器端所信任的所有證書發行機構的CA串列,客戶端會用這些資訊來篩選證書,

ServerHello Done

該訊息表示服務器已經將所有資訊發送完畢,接下來等待客戶端的訊息,

Certificate訊息資料包

在這里插入圖片描述

Server Key Exchange訊息資料包

在這里插入圖片描述

在Diffie-Hellman中,客戶端無法自行計算預主密鑰; 雙方都有助于計算它,因此客戶端需要從服務器獲取Diffie-Hellman公鑰,

由上圖可知,此時密鑰交換也由簽名保護,

ServerHello Done資料包

在這里插入圖片描述

SSL握手協議第三階段

在這里插入圖片描述

Certificate ( 可選)

如果在第二階段服務器端要求發送客戶端證書,客戶端便會在該階段將自己的證書發送過去,服務器端在之前發送的Certificate Request訊息中包含了服務器端所支持的證書型別和CA串列,因此客戶端會在自己的證書中選擇滿足這兩個條件的第一個證書發送過去,若客戶端沒有證書,則發送一個no_ certificate警告 ,

Client Key exchange

根據之前從服務器端收到的亂數,按照不同的密鑰交換演算法,算出一一個pre-master,發送給服務器,服務器端收到pre-master算出main master.而客戶端當然也能自己通過pre-master算出main master.如此以來雙方就算出了對稱密鑰,

Certificate verify (可選)

只有在客戶端發送了自己證書到服務器端,這個訊息才需要發送,其中包含一個簽名,對從第一條訊息以來的所有握手訊息的HMAC值(用master_ secret) 進行簽名,

Client Key exchange資料包

在這里插入圖片描述

SSL握手協議第四階段

在這里插入圖片描述

建立起一個安全的連接,客戶端發送一個Change Cipher Spec訊息,并且把協商得到的CipherSuite拷貝到當前連接的狀態之中,然后,客戶端用新的演算法、密鑰引數發送一個Finished訊息,這條訊息可以檢查密鑰交換和認證程序是否已經成功,其中包括一個校驗值,對客戶端整個握手程序的訊息進行校驗,服務器同樣發送Change Cipher Spec訊息和Finished訊息,握手程序完成,客戶端和服務器可以交換應用層資料進行通信,
在這里插入圖片描述

Server Finished:
服務端握手結束通知,

使用私鑰解密加密的Pre-master資料,基于之前(Client Hello 和 Server Hello)交換的兩個明文亂數 random_C 和 random_S,計算得到協商密鑰:enc_key=Fuc(random_C, random_S, Pre-Master);
計算之前所有接收資訊的 hash 值,然后解密客戶端發送的 encrypted_handshake_message,驗證資料和密鑰正確性;
發送一個 ChangeCipherSpec(告知客戶端已經切換到協商過的加密套件狀態,準備使用加密套件和 Session Secret加密資料了)
服務端也會使用 Session Secret 加密一段 Finish 訊息發送給客戶端,以驗證之前通過握手建立起來的加解密通道是否成功,

SSL會話恢復

在這里插入圖片描述

會話恢復是指只要客戶端和服務器已經通信過一次,它們就可以通過會話恢復的方式來跳過整個握手階段而直接進行資料傳輸,

SSL采用會話恢復的方式來減少SSL握手程序中造成的巨大開銷,

此功能從原來正常協調的13步,減少到只需要6步,大大減少了SSL VPN隧道建立所需要的開銷,

為了加快建立握手的速度,減少協議帶來的性能降低和資源消耗(具體分析在后文),TLS 協議有兩類會話快取機制:

會話標識 session ID: 由服務器端支持,協議中的標準欄位,因此基本所有服務器都支持,服務器端保存會話ID以及協商的通信資訊,Nginx 中1M 記憶體約可以保存4000個 session ID 機器相關資訊,占用服務器資源較多;

會話記錄 session ticket :需要服務器和客戶端都支持,屬于一個擴展欄位,支持范圍約60%(無可靠統計與來源),將協商的通信資訊加密之后發送給客戶端保存,密鑰只有服務器知道,占用服務器資源很少,

二者對比,主要是保存協商資訊的位置與方式不同,類似與 http 中的 session 與 cookie,二者都存在的情況下,(nginx 實作)優先使用 session_ticket,

會話恢復具體程序(Session ID機制):

1.如果客戶端和服務器之間曾經建立了連接,服務器會在握手成功后回傳 session ID,并保存對應的通信引數在服務器中;

2.如果客戶端再次需要和該服務器建立連接,則在 client_hello 中 session ID 中攜帶記錄的資訊,發送給服務器;

3.服務器根據收到的 session ID 檢索快取記錄,如果沒有檢索到貨快取過期,則按照正常的握手程序進行;

4.如果檢索到對應的快取記錄,則回傳 change_cipher_spec與 encrypted_handshake_message 資訊,兩個資訊作用類似,encrypted_handshake_message 是到當前的通信引數與 master_secret的hash 值;

5.如果客戶端能夠驗證通過服務器加密資料,則客戶端同樣發送 change_cipher_spec 與 encrypted_handshake_message 資訊;
服務器驗證資料通過,則握手建立成功,開始進行正常的加密資料通信,

會話恢復具體程序( session ticket):

1.如果客戶端和服務器之間曾經建立了連接,服務器會在 new_session_ticket 資料中攜帶加密的 session_ticket 資訊,客戶端保存;

2.如果客戶端再次需要和該服務器建立連接,則在 client_hello 中擴展欄位 session_ticket 中攜帶加密資訊,一起發送給服務器;

3.服務器解密 sesssion_ticket 資料,如果能夠解密失敗,則按照正常的握手程序進行;

4.如果解密成功,則回傳 change_cipher_spec 與 encrypted_handshake_message 資訊,兩個資訊作用與 session ID 中類似;

5.如果客戶端能夠驗證通過服務器加密資料,則客戶端同樣發送 change_cipher_spec與encrypted_handshake_message 資訊;

6.服務器驗證資料通過,則握手建立成功,開始進行正常的加密資料通信,

SSL原理(記錄協議)

在這里插入圖片描述

SSL記錄協議主要用來實作對資料塊的分塊、加密解密、壓縮與解壓縮、完整性檢查及封裝各種高層協議,

每個SSL記錄包含以下資訊:

  • 內容型別
  • 協議版本號,目前有2.0和3.0版本
  • 記錄資料的長度
  • 資料有效載荷
  • 散列演算法計算訊息認證代碼

詳細步驟
在這里插入圖片描述

(1)將上層分下來的資料包分成合適的資料塊,但是每個資料塊不得超過214位元組,

(2)對每個資料塊進行壓縮,但是不能丟失資料資訊,

(3)計算壓縮后的資料訊息認證碼MAC,并添加在壓縮包后,添加后總長度不得超過2262位元組,

(4)對于流加密,壓縮保額和MAC以前被加密,對于分組加密,在MAC之后,加密之前可以增加填充,填充由表示填充長度的位元組和移動數目的填充位元組組成,填充位元組的數目使得要加密的資料的總長度成為加密分組長度整數倍的最小數目,

(5)給SSL添加一個首部,其中包括:內容型別、主要版本、次要版本、壓縮長度等
資訊,

通過以上程序把原始的資料加密為SSL協議的記錄集,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/267161.html

標籤:其他

上一篇:Linux系統編程之行程(Linux行程,fork()函式,僵尸行程,孤兒行程)

下一篇:遞回與分治[資料結構與演算法]

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more