【網絡安全技術】傳輸層安全——SSL/TLS

一、TLS位置及架構

TLS建立在傳輸層TCP/UDP之上,應用層之下。

所以這可以解決一個問題,那就是為什么抓不到HTTP和SMTP包,因為這兩個在TLS之上,消息封上應用層的頭,下到TLS層,TLS層對上層消息整個做了加密,然后套了TLS頭下到傳輸層,套上TCP頭給IP,IP套上IP頭然后路由,找到下一跳之后ARP問MAC地址,然后封上MAC頭,進鏈路層傳輸。所以能看到的是TLS頭、TCP頭,IP頭和MAC頭。

下面這個圖是TLS的架構,TLS內部也分了層,最上層相當于是消息的類型,這幾種類型的消息都要下到Record層,套Record頭,走Record結構來傳輸。

握手協議就是建連接的,改變Cipher spec協議就是協商用到的加密算法什么的東西的,Alert協議是返回一些警報,HTTP就是正常的加密的數據,心跳協議是用來維持連接的。

等下可以通過抓到的包來更清晰的看出來這個架構。

二、TLS握手協議

整體流程如下,從RFC 5246文檔里偷過來的,

      Client                                               ServerClientHello                  -------->ServerHelloCertificate*ServerKeyExchange*CertificateRequest*<--------      ServerHelloDoneCertificate*ClientKeyExchangeCertificateVerify*[ChangeCipherSpec]Finished                     -------->[ChangeCipherSpec]<--------             FinishedApplication Data             <------->     Application Data

1.Phase 1

一步一步看,先看綠色框起來的兩個hello

client hello是第一個消息,注意區分這個握手和TCP握手之間的區別,TCP三次握手是建TCP連接用的,而TLS要走TCP連接,所以在TLS握手之前,TCP已經握完三次手了。

這是訪問一個頁面https協議的過程,雖然不知道為什么所有包都有兩個,但還是可以清晰地看出,TCP三次握手是在TLS ClientHello之前完成的,同時,看TLS下面的這兩個TCP ACK,這也說明了TCP在TLS之下,所以TLS不能加密TCP的頭。

我們來看看這個hello包長什么樣。首先能看出TLS所在的層級,正如剛才所說,他在TCP之上。

其次TLS的內容,這里是handshake Protocol,使用TLS Record protocol封裝,所以TLS的所有內容協議,包括握手協議、改變Cipher spec協議、Alert協議、HTTP、心跳協議都是走Record Layer的,所以實際上TLS分兩層,在TCP緊上面那層是Record 協議,然后在上邊是剩下的協議。

然后看內容吧,對比剛才那張圖,這里包括了TLS的版本,隨機數,session ID,cipher suite(也就是客戶端能接受的加密、認證、密鑰交換算法),還有壓縮方法。剩下的一堆extension列出了更加細節的客戶端所支持的算法,這樣服務器只能在這些列出的里面選擇。

接下來是Server hello,

他會選擇一系列的方法,作為響應回復給Client。這里的一些extension例如session_ticket是用來當session斷開時客戶端快速連接到服務器的憑證,以及下面的對于應用層協議的下協商。

2.Phase 2

這里階段二還是抓個包看看,這wireshark不知道抽什么風,這三個Certificate,Server Key Exchange和Server Hello Done都在一層的一個包里,他給分了兩個。

看這三個東西還都是封到了Record Layer里,這三個分別顧名思義,證書就是服務器把他的X.509證書給客戶端,交換密鑰就是服務器通過hello里跟客戶端商量的協商密鑰算法來交換公鑰,這里是橢圓曲線DH。這之后還有可選的服務器向客戶端要證書。之后就是server hello done表示他這邊結束了,該客戶端了。

別忘了這些包都是走的TCP,到了對方那都要回ACK的。

3.phase 3

前面二階段server發來的證書,client首先會驗一下真假,使用CA的公鑰來驗證證書的簽名。對了之后,首先,如果先前服務器要了客戶端的證書,客戶端會先把他的證書回給服務器。然后他會用server的公鑰來驗server發來的key exchange參數的簽名,之后再生成自己的公鑰交換信息,

這就是下面抓到的包,第一個就是client Key exchange的record。

接下來還有一個certificate verify,這個是只有剛才客戶端發送了有簽名能力的證書才有的一步。

4.phase 4

然后是Change Cipher Spec,這個消息你看長度就1字節,他就是簡單的告訴對方我已經將剛才咱們商量的加密什么的投入使用了,所以他發的接下來的包都是使用剛才協商好的東西加密或認證的了。在這之前,客戶端和服務器交換完密鑰,獲得了一個比如DH公共秘密之后,這個公共秘密叫做pre-master secret,這個結合一些其他的例如隨機數之類的信息,再來生成最終的session key,Change Cipher Spec代表的就是這個最終的session key投入使用。

后面跟的是client finished,這個永遠緊跟在Change Cipher Spec之后,用于驗證整個握手的成功。客戶端會計算之前所有的握手消息的一個mac,加密之后傳給服務器。所以下面抓的包顯示這是加密的信息。

這之后,服務器端收到剛才客戶端發來的那條消息之后,由于之前在hello里說好了要有new session ticket用來之后快速恢復session,所以這第一個record就是new session ticket,然后是服務器端的Change Cipher Spec,之后是服務器的finish,和client的同理,是計算先前的所有握手消息的mac,同樣是加密之后發送。

這之后握手就結束了,這期間任何的錯誤都會引起alert協議報錯,從而終止過程。

三、Alert Protocol

這個就是報各種錯誤,包括下面這些

? bad_record_mac

? handshake_failure

? decryption_failed

? bad_certificate

四、Heartbeat protocol

這個就是周期性的發送信號,比如用來同步。

他有兩個目的,一個是確保雙方還活著,另一個是防止有些防火墻會關閉空閑連接。

五、Record protocol

這個剛才也看了,就是封裝剛才提到的所有的東西的,格式就是下面這樣

content type就會是比如剛才所有握手階段的Record都是handshake(22),實際發的包的type會是Application Data(23),也可能回事Alert(21)等等。

兩個Version就是哪個版本,前面講的例子都是TLSv1.2,長度就是后面的東西有多長。

接下來看看這個Record是怎么生成的吧,比如有加密、認證、分段、壓縮等步驟。

首先拿到具體的數據之后,要分成小于等于2的14次方byte的段,然后如果之前協商了壓縮,那么就會壓縮。

接下來計算MAC然后接上去,對整個東西加密,然后再套上TLS Record的頭,這就是完整的TLS處理完的,可以直接發給下層TCP的東西了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214261.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214261.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214261.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數的劃分(遞歸)

題目名字 數的劃分 題目鏈接 題意 給數字n&#xff0c;講數字n分為m份&#xff0c;共有多少種分法&#xff0c;不能重復&#xff0c;分成一樣的數字也不行 思路 看到這種分數字的先化成有多少個球要分到多少個籃子里去再想兩個分法并且加起來&#xff0c;一個是每個籃子最多只…

<JavaEE> 經典設計模式之 -- 單例模式(“餓漢模式”和“懶漢模式”實現單例模式)

目錄 一、單例模式概述 二、“餓漢模式”實現單例模式 三、“懶漢模式”實現單例模式 3.1 單線程下的“懶漢模式” 3.2 多線程下的“懶漢模式” 一、單例模式概述 1&#xff09;什么是單例模式&#xff1f; 單例模式是一種設計模式。 單例模式可以保證某個類在程序中只存…

【Java數據結構 -- 順序表】

List和ArrayList與順序表 一. List1.1 List介紹2.1 常見接口介紹3.1 List的使用 二. ArrayList與順序表1.線性表2.順序表2.1 接口的實現2.2 順序表的創建2.3 順序表的打印2.4 順序表的插入2.5 順序表的按索引位置插入數據2.6 判斷順序表是否包含某個數2.7 返回順序表某個數的索…

Java 22種設計模式詳解

22種設計模式詳解 創建型模式單例模式工廠方法模式抽象工廠模式建造者模式原型模式 結構型模式適配器模式橋接模式組合模式裝飾器模式代理模式外觀模式享元模式享元模式原理&#xff1a;享元模式角色&#xff1a;示例代碼&#xff1a; 行為型模式模板方法模式原理角色示例代碼命…

UEFI 學習筆記

引言 相比于Windows/MacOS/Linux等主流的操作系統,大部分人對于固件BIOS(Basic Input & Output System)并不熟悉,它誕生于1981年出產的第一代個人計算機IBM PC,在那時工程師將硬件檢測代碼、最基本的外圍設備I/O處理程序和操作系統引導程序代碼寫入僅有32KB大小的PRO…

(1)(1.4) ESP32 wifi telemetry

文章目錄 前言 1 用于ESP32的DroneBridge 2 推薦的硬件 3 下載和燒錄固件 4 為ESP32配置DroneBridge 前言 ESP32 是現成的 Wi-Fi 模塊&#xff0c;具有完整的 TCP/IP 協議棧和微控制器功能。它們提供專用的 UART、SPI 和 I2C 接口。它們可與任何 ArduPilot 自動駕駛控制器…

2023-12學習筆記

1.NonNull要手動寫無參構造器 這是一個我今天研究了很久的問題&#xff0c;開始不知道原因是在這里&#xff0c;還在那想是不是Data覆蓋了無參構造&#xff0c;結果當然不是。先說下解決歷程 1.問題起因 通過RequestBody接收前端報文的時候報錯&#xff0c;大致是說我構造方…

python中tkinter實現GUI程序:三個實例

python中tkinter實現GUI程序 寫在最前面Python中使用Tkinter實現GUI程序的基本元素Tkinter簡介基本元素1. 根窗口&#xff08;Root Window&#xff09;2. 小部件&#xff08;Widgets&#xff09;3. 布局管理4. 事件處理 1.用 tkinter實現一個簡單的 GUI程序,單擊“click”按鈕&…

項目方看過來,詳解Moonbeam Grants申請技巧

Grants加速計劃是Moonbeam基金會發起的生態資助計劃&#xff0c;旨在支持生態系統中的不同項目、社區和個人&#xff0c;幫助他們順利進入Moonbeam發展&#xff0c;依靠早期的生態扶持迅速成長。 每一份Grant計劃旨在融合社區參與、包容性和透明度等特性&#xff0c;加速Moonb…

Java項目-瑞吉外賣Day3

填充公共字段&#xff1a; 目的&#xff1a;由于某些屬性&#xff0c;例如createdTime這些需要填充的字段會在多個地方出現&#xff0c;所以考慮使用公共字段自動填充的辦法減少重復代碼。 在對應屬性上加入TableField注解。通過fill字段表明策略&#xff0c;是插入/更新的時候…

Android studio之ConstraintLayout使用

文章目錄 優勢使用ConstraintLayout的步驟使用多種方式定義控件的位置 優勢 ConstraintLayout是一個相對布局&#xff0c;是在Android 2.3版本中引入的。它可以在不同的屏幕大小和分辨率中提供一致的布局&#xff0c;并且是支持復雜布局的最佳選擇之一。ConstraintLayout相對于…

ROS2+ROS_DOMAN_ID

The ROS_DOMAIN_ID? Table of Contents Overview Choosing a domain ID (short version) Choosing a domain ID (long version) Platform-specific constraints Participant constraints Domain ID to UDP Port Calculator Overview? As explained elsewhere, the de…

Dockerfile模板和Docker Compose模板

記錄一下Dockerfile模板和Docker Compose模板&#xff0c; 基礎的系統加JDK環境來構建一個Java應用&#xff0c;其Dockerfile內容如下&#xff1a; # 基礎鏡像 FROM openjdk:11.0-jre-buster # 設定時區 ENV TZAsia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/local…

如何搭建廢品上門回收小程序

如今&#xff0c;隨著環境保護意識的增強&#xff0c;廢品的回收和再利用變得越來越重要。為了方便人們進行廢品回收&#xff0c;搭建一個廢品上門回收的小程序成為了一個不錯的選擇。本文將介紹如何從零開始搭建一個廢品上門回收小程序。 …

vue寶典之項目結構介紹

文章目錄 &#x1f341;前言&#x1f341;Vue.js基本概念&#x1f341;Vue.js核心特性&#x1f341;Vue.js應用場景&#x1f341;Vue項目結構&#x1f341;Vue開發流程 目前在學習vue項目&#xff0c;之前只是學習vue中基本語法&#xff0c;當接觸項目時發現vue項目結構之間配置…

【Go自學版】02-goroutine

利用時間片分割進程&#xff0c;致使宏觀上A,B,C同時執行&#xff08;并發&#xff09; CPU利用率包含了執行和切換&#xff0c;進程/線程的數量越多&#xff0c;切換成本也會增大 最大并行數&#xff1a;GOMAXPROCS work stealing: 偷其他隊列的G hand off: 當前G1阻塞&#…

css 修改滾動條樣式,解決Windows瀏覽器中滾動條不美觀問題

Windows環境中的瀏覽器中滾動條默認是直接顯示了&#xff0c;不管光標是否進入該區域&#xff0c;這樣就很不美觀&#xff0c;如下圖&#xff1a; 之前樣式為 .well {display: block;background-color: #f2f2f2;border: 1px solid #ccc;margin: 5px;width: calc(100% - 12px);h…

mycat部署和配置讀寫分離(二)

說明&#xff1a; MyCAT 是使用 JAVA 語言進行編寫開發&#xff0c;使用前需要先安裝 JAVA 運行環境(JRE),由于 MyCAT 中使用了 JDK7 中的一些特性&#xff0c;所以要求必須在 JDK7 以上的版本上運行。 1. jdk1.8安裝 詳見jdk環境安裝 2. Mysql安裝 詳見mysql8.0.11源碼安裝…

websoket 的使用

WebSocket是HTML5的API之一&#xff0c;允許瀏覽器和服務器之間進行雙向通信。Vue.js可以輕松地與WebSocket API集成&#xff0c;使用原生WebSocket API或其他WebSocket庫&#xff08;如socket.io&#xff09;都是可行的。 下面是一個使用Vue.js實現WebSocket的簡單示例&#…

【lesson11】數據類型之string類型

文章目錄 數據類型分類string類型set類型測試 enum類型測試 string類型的內容查找找所有女生&#xff08;enum中&#xff09;找愛好有游泳的人&#xff08;set中&#xff09;找到愛好中有足球和籃球的人 數據類型分類 string類型 set類型 說明&#xff1a; set&#xff1a;集…