導航:首頁 > 源碼編譯 > tls摘要演算法

tls摘要演算法

發布時間:2024-07-08 10:40:42

1. 用WireShark簡單看看SSL/TLS協議

HTTPS目前是網站標配,否則瀏覽器會提示鏈接不安全,同HTTP相比比,HTTPS提供安全通信,具體原因是多了個「S」層,或者說SSL層[Secure Sockets Layer],現在一般都是TLS[Transport Layer Security],它是HTTP 明文 通信變成安全 加密通信 的基礎,SSL/TLS介於應用層和TCP層之間,從應用層數據進行加密再傳輸。安全的核心就在加密上:

如上圖所示,HTTP明文通信經中間路由最終發送給對方,如果中間某個路由節點抓取了數據,就可以直接看到通信內容,甚至可以篡改後,路由給目標對象,如下:

可見HTTP傳輸是不安全的,但,如果傳輸的是只有雙方可校驗的密文,就可以避免被偷竊、篡改,保證傳輸的安全性,這就是SSL/TLS層做的事情。

SSL/TLS協議主要從三方面來保證數據傳輸的安全性:保密、鑒別、完整:

對用戶端而言:怎麼保證訪問的網站就是目標網站?答案就是 證書 。每個HTTPS網站都需要TLS證書,在數據傳輸開始前,服務端先將證書下發到用戶端,由用戶根據證書判斷是否是目標網站。這其中的原理是什麼,證書又是如何標識網站的有效性呢?證書也叫 digital certificate 或者public key certificate,是密碼學中的概念,在TLS中就是指CA證書【 由證書的簽發機構(Certificate Authority,簡稱為 CA)頒布的證書 】,好比是權威部門的公章,WIKI網路解釋如下:

大意就是證書包含了目標站點的身份信息,並可以通過某種方式校驗其合法性,對於任何一個HTTPS網站,你都可以拿到其CA證書公鑰信息,在Chrome瀏覽器中點擊HTTPS網站的鎖標志,就可以查看公鑰信息,並可以導出CA二進制文件:

瀏覽器就是通過這個文件來校驗網站是否安全合法,可以看到,證書其實內置了一個頒發鏈條關系,根證書機構->次級證書機構->次次級->網站自身,只要驗證這個鏈條是安全的,就證明網站合法,背後的技術其實是 信任鏈+RSA的非對稱加密+系統內置根證書 。CA在頒發證書的時候,會用自己的私鑰計算出要頒發證書的簽名,其公鑰是公開的,只要簽名可被公鑰驗證就說明該證書是由該CA頒發的,核心校驗邏輯如下

那麼上級的CA又是如何保證安全呢?重復上述操作即可,最終都是靠根證書來驗證的,根證書的安全性不需要驗證,由系統保證,如此就形成了一個證書的信任鏈,也就能驗證當前網站證書的有效性,證書的信任鏈校驗如下:

TLS協議最大的提升點就是數據的安全,通HTTP通信相比,HTTPS的通信是加密的,在協商階段,通過非對稱加密確定對稱加密使用的秘鑰,之後利用對稱秘鑰進行加密通信,這樣傳輸的數據就是密文,就算中間節點泄漏,也可以保證數據不被竊取,從而保證通信數據的安全性。

第三個問題,雖然中間節點無法竊取數據,但是還是可以隨意更改數據的,那麼怎麼保證數據的完整性呢,這個其實任何數據傳輸中都會有這個問題,通過MAC[Message Authentication Codes]信息摘要演算法就可以解決這個問題,同普通MD5、SHA等對比,MAC消息的散列加入了秘鑰的概念,更加安全,是MD5和SHA演算法的升級版,可以認為TLS完整性是數據保密性延伸,接下來就藉助WireShark看看TLS握手的過程,並看看是如何實現身份鑒別、保密性、完整性的。

HTTPS安全通信簡化來說: 在協商階段用非對稱加密協商好通信的對稱秘鑰 ,然後 用對稱秘鑰加密進行數據通信 ,簡易的WireShark TLS/SSL協商過程示意如下:

細化分離後示意如下:

握手分多個階段,不過一次握手可以完成多個動作,而且也並不是所有類型的握手都是上述模型,因為協商對稱秘鑰的演算法不止一種,所以握手的具體操作也並非一成不變,比如RSA就比ECDHE要簡單的多,目前主流使用的都是ECDHE,具體流程拆分如下:

Client Hello是TLS/SSL握手發起的第一個動作,類似TCP的SYN,Client Hello 階段客戶端會指定版本,隨機數、支持的密碼套件供服務端選擇,具體的包數據如下

啟動TLS握手過程, 提供自己所能支持各種演算法,同時提供一個將來所能用到的隨機數

ContentType指示TLS通信處於哪個階段階段,值22代表Handshake,握手階段,Version是TLS的版本1.2,在握手階段,後面鏈接的就是握手協議,這里是Client Hello,值是1,同時還會創建一個隨機數random給Server,它會在生成session key【對稱密鑰】時使用。之後就是支持的供服務端選擇的密碼套件,接下來等服務端返回。

Handshake Type: Server Hello (2),作為對Client Hello的響應 , 確定使用的加密套件 : TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f),密鑰協商使用 ECDHE,簽名使用 RSA,
數據通信通信使用 AES 對稱加密,並且密鑰長度是128位,GCM分組,同時生成一個服務端的random及會話ID回傳。

這一步伺服器將配置的證書【鏈】發送給客戶端,客戶端基於上文所述的證書鏈校驗證書的有效性,這里發送的證書是二進制格,可以利用wireshark右鍵「Export Packet Bytes」功能,導出.CER格式的證書。如下可以看到傳輸的證書鏈。

導出的CER格式的證書如下,最關鍵的就其公鑰跟數字簽名。

Server Key Exchange是針對選定的ECDHE協商所必須的步驟,Diffie-Hellman模型解釋如下:

大意就是ephemeral Diffie-Hellman不會使用證書中的靜態公鑰參與對稱秘鑰的生成,而是需要服務端與客戶端通過彼此協商確定對稱秘鑰,而D-H演算法模型需要兩對非對稱秘鑰對,各端保留自己的私鑰,同時握有雙方的公鑰,然後基於D-H演算法雙端可以算出一樣的對稱加密秘鑰,而這就需要C/S互傳自己的公鑰

服務端做完這一步,其實ECDHE演算法中服務端需要提供的信息已經結束,發送 Server Hello Done告訴客戶端,然後等待客戶端回傳它的D-H公鑰。

演算法:

其中p和g是公開的DH參數,只要P是一個足夠大的數,在不知道私鑰的情況下,即使截獲了雙方的公鑰,也是很難破解的。

客戶端收到服務端的證書後,利用信任鏈檢測證書有效性,同時也會同Server Key Exchange 類似,將自己的Diffie-Hellman公鑰發送給Server端,

至此,ECDHE協商所需要的信息都傳輸完畢, 雙方都可以基於ECDHE演算法算出的共享密鑰,同時結合之前的隨機數生成最終的對稱加密秘鑰:

之後客戶端發送Change Cipher Spec與 Encrypted Handshake Message標識握手完成,同時傳輸一個加密的數據給Server,驗證雙方確立的秘鑰是否正確,這就需要服務端也要重復這個操作給客戶端,這樣才能驗證彼此的加解密一致,即服務端也要來一次Encrypted Handshake Message回傳給客戶端校驗,

走完如上流程,雙方就確認了正確的對稱加密通道,後面就是TLS的數據通信,其Record Layer的ContentType 也會變成 Content Type: Application Data (23):

最終對稱會話密鑰包含三部分因子:

Client Hello與Server Hello階段交換的隨機數,是為了提高秘鑰的「隨機」程度而進行的,這樣有助於提高會話密鑰破解難度。

HTTPS通過加密與完整性校驗可以防止數據包破解與篡改,但對於主動授信的抓包操作是沒法防護,比如Charles抓包,在這個場景用戶已經風險,並且將Charles提供的證書信任為根證書,這從源頭上構建了一條虛擬的信任鏈:在握手階段,Charles利用自己的公鑰,生成客戶端可以信任的篡改證書,從而可以充作中間人進而抓包,所謂中間人攻擊,感覺跟Https抓包原理一樣,都是要強制添加一個自己的信任根證書。

2. SSL/TLS協議解析

本文藉助wireshark抓包詳細的講解SSL/TLS協議。HTTPS是為了解決http報文明文傳輸過程中的安全問題。HTTPS是「HTTP over SSL」的縮寫。所以要了解HTTPS就必須先了解SSL/TLS協議。

HTTP協議中所有消息都是明文傳播,存在如下三大風險

為了解決這個三個風險,分別對應如下三個解決方案。

由於SSL的2個版本都已經退出歷史舞台了,所以本文後面只用TLS這個名字。 一般所說的SSL就是TLS。

TLS建立連接的過程如下圖,先有個大概的印象,後面我們再詳細分析。整個需要四次握手。

SSL/TLS工作在應用層和傳輸層之間 ,在建立連接的之前需要先建立TCP連接(三次握手),如下圖。

記錄協議根據rfc描述 記錄協議(Record Layer) 有如下4種類型,即上圖中Content Type可以取的值。

記錄協議(Record Layer) 數據結構

握手協議(Handshake Protocal) 有如下10種類型。

握手協議(Handshake Protocal) 數據結構

wireshark抓包顯示客戶端支持的加密套件有31種。 cipher的格式為:認證演算法 密鑰交換演算法 加密演算法_ 摘要演算法 。server會從這些演算法組合中選取一組,作為本次SSL連接中使用。

這個包告訴我們伺服器和客戶端是通過Diffie-Hellman演算法來生成最終的密鑰(也就是Sessionkey會話密鑰),pubkey是Diffie-Hellman演算法中的一個參數,這個參數需要通過網路傳給客戶端,即使它被截取也不會影響安全性。具體見參考文獻三。
在client hello和server hello包中都有Random欄位,上面我們是沒有說明的,client和server這兩個隨機數加Diffie-Hellman演算法生成出來的這個key。一共三個數字生成最終對稱加密的key

從現在開始發送的數據就是採用上述步驟協商出的對稱加密密鑰加密過的數據了

再回過頭來看一下這張圖,加密過程總結如下:

3. TLS/SSL數字證書里的指紋演算法、簽名演算法和簽名哈希演算法各是做什麼用的

您好!

作用與目的相同都是為了進行加密,更好的保護平台,SSL安全哈希演算法,是數字簽名演算法標准,所以無論您在哪裡注冊無論多少價格的證書,其演算法基本上都是相同的!

申請SSL證書為考慮到瀏覽器兼容性,保持更多的瀏覽器可以訪問,通常採取加密演算法:RSA 2048 bits,簽名演算法:SHA256WithRSA,該演算法被公認使用,就是網路也使用該演算法!

RSA加密演算法:公鑰用於對數據進行加密,私鑰用於對數據進行解密。

RSA簽名演算法:在簽名演算法中,私鑰用於對數據進行簽名,公鑰用於對簽名進行驗證。

加密演算法分為兩大類:1、對稱加密演算法 2、非對稱加密演算法。

由於計算能力的飛速發展,從安全性角度考慮,很多加密原來SHA1WithRSA簽名演算法的基礎上,新增了支持SHA256WithRSA的簽名演算法。該演算法在摘要演算法上比SHA1WithRSA有更強的安全能力。目前SHA1WithRSA的簽名演算法會繼續提供支持,但為了您的應用安全,強烈建議使用SHA256WithRSA的簽名演算法。

4. TLS 詳解

SSL (Secure Sockets Layer) 安全套接層,是一種安全協議,經歷了 SSL 1.0、2.0、3.0 版本後發展成了標准安全協議 - TLS (Transport Layer Security) 傳輸層安全性協議。TLS 有 1.0 (RFC 2246)、1.1(RFC 4346)、1.2(RFC 5246)、1.3(RFC 8446) 版本。

TLS 在實現上分為 記錄層 握手層 兩層,其中握手層又含四個子協議: 握手協議 (handshake protocol)、更改加密規范協議 (change cipher spec protocol)、應用數據協議 (application data protocol) 和警告協議 (alert protocol)

只需配置瀏覽器和伺服器相關設置開啟 TLS,即可實現 HTTPS,TLS 高度解耦,可裝可卸,與上層高級應用層協議相互協作又相互獨立。

TLS/SSL 的功能實現主要依賴於三類基本演算法:散列函數 Hash、對稱加密和非對稱加密,其利用非對稱加密實現身份認證和密鑰協商,對稱加密演算法採用協商的密鑰對數據加密,基於散列函數驗證信息的完整性。

TLS 的基本工作方式是,客戶端使用非對稱加密與伺服器進行通信,實現身份驗證並協商對稱加密使用的密鑰,然後對稱加密演算法採用協商密鑰對信息以及信息摘要進行加密通信,不同的節點之間採用的對稱密鑰不同,從而可以保證信息只能通信雙方獲取。

例如,在 HTTPS 協議中,客戶端發出請求,服務端會將公鑰發給客戶端,客戶端驗證過後生成一個密鑰再用公鑰加密後發送給服務端(非對稱加密),雙方會在 TLS 握手過程中生成一個協商密鑰(對稱密鑰),成功後建立加密連接。通信過程中客戶端將請求數據用協商密鑰加密後發送,服務端也用協商密鑰解密,響應也用相同的協商密鑰。後續的通信使用對稱加密是因為對稱加解密快,而握手過程中非對稱加密可以保證加密的有效性,但是過程復雜,計算量相對來說也大。

記錄協議負責在傳輸連接上交換的所有底層消息,並且可以配置加密。每一條 TLS 記錄以一個短標頭開始。標頭包含記錄內容的類型 (或子協議)、協議版本和長度。原始消息經過分段 (或者合並)、壓縮、添加認證碼、加密轉為 TLS 記錄的數據部分。

記錄層將信息塊分割成攜帶 2^14 位元組 (16KB) 或更小塊的數據的 TLSPlaintext 記錄。

記錄協議傳輸由其他協議層提交給它的不透明數據緩沖區。如果緩沖區超過記錄的長度限制(2^14),記錄協議會將其切分成更小的片段。反過來也是可能的,屬於同一個子協議的小緩沖區也可以組合成一個單獨的記錄。

壓縮演算法將 TLSPlaintext 結構轉換為 TLSCompressed 結構。如果定義 CompressionMethod 為 null 表示不壓縮

流加密(BulkCipherAlgorithm)將 TLSCompressed.fragment 結構轉換為流 TLSCiphertext.fragment 結構

MAC 產生方法如下:

seq_num(記錄的序列號)、hash(SecurityParameters.mac_algorithm 指定的哈希演算法)

塊加密(如 RC2 或 DES),將 TLSCompressed.fragment 結構轉換為塊 TLSCiphertext.fragment 結構

padding: 添加的填充將明文長度強制為塊密碼塊長度的整數倍。填充可以是長達 255 位元組的任何長度,只要滿足 TLSCiphertext.length 是塊長度的整數倍。長度大於需要的值可以阻止基於分析交換信息長度的協議攻擊。填充數據向量中的每個 uint8 必須填入填充長度值 (即 padding_length)。

padding_length: 填充長度應該使得 GenericBlockCipher 結構的總大小是加密塊長度的倍數。合法值范圍從零到 255(含)。 該長度指定 padding_length 欄位本身除外的填充欄位的長度

加密塊的數據長度(TLSCiphertext.length)是 TLSCompressed.length,CipherSpec.hash_size 和 padding_length 的總和加一

加密和 MAC 功能將 TLSCompressed 結構轉換為 TLSCiphertext。記錄的 MAC 還包括序列號,以便可以檢測到丟失,額外或重復的消息。

記錄協議需要一種演算法,從握手協議提供的安全性參數生成密鑰、 IV 和 MAC secret.

主密鑰 (Master secret): 在連接中雙方共享的一個 48 位元組的密鑰
客戶隨機數 (client random): 由客戶端提供的 32 位元組值
伺服器隨機數 (server random): 由伺服器提供的 32 位元組值

握手是 TLS 協議中最精密復雜的部分。在這個過程中,通信雙方協商連接參數,並且完成身 份驗證。根據使用的功能的不同,整個過程通常需要交換 6~10 條消息。根據配置和支持的協議擴展的不同,交換過程可能有許多變種。在使用中經常可以觀察到以下三種流程:(1) 完整的握手, 對伺服器進行身份驗證;(2) 恢復之前的會話採用的簡短握手;(3) 對客戶端和伺服器都進行身份驗證的握手。

握手協議消息的標頭信息包含消息類型(1 位元組)和長度(3 位元組),餘下的信息則取決於消息類型:

每一個 TLS 連接都會以握手開始。如果客戶端此前並未與伺服器建立會話,那麼雙方會執行一次完整的握手流程來協商 TLS 會話。握手過程中,客戶端和伺服器將進行以下四個主要步驟:

下面介紹最常見的握手規則,一種不需要驗證客戶端身份但需要驗證伺服器身份的握手:

這條消息將客戶端的功能和首選項傳送給伺服器。

是將伺服器選擇的連接參數傳回客戶端。

這個消息的結構與 ClientHello 類似,只是每個欄位只包含一個選項,其中包含服務端的 random_S 參數 (用於後續的密鑰協商)。伺服器無需支持客戶端支持的最佳版本。如果伺服器不支持與客戶端相同的版本,可以提供某個其他版本以期待客戶端能夠接受

圖中的 Cipher Suite 是後續密鑰協商和身份驗證要用的加密套件,此處選擇的密鑰交換與簽名演算法是 ECDHE_RSA,對稱加密演算法是 AES-GCM,後面會講到這個

還有一點默認情況下 TLS 壓縮都是關閉的,因為 CRIME 攻擊會利用 TLS 壓縮恢復加密認證 cookie,實現會話劫持,而且一般配置 gzip 等內容壓縮後再壓縮 TLS 分片效益不大又額外佔用資源,所以一般都關閉 TLS 壓縮

典型的 Certificate 消息用於攜帶伺服器 X.509 證書鏈 。
伺服器必須保證它發送的證書與選擇的演算法套件一致。比方說,公鑰演算法與套件中使用的必須匹配。除此以外,一些密鑰交換演算法依賴嵌入證書的特定數據,而且要求證書必須以客戶端支持的演算法簽名。所有這些都表明伺服器需要配置多個證書(每個證書可能會配備不同的證書鏈)。

Certificate 消息是可選的,因為並非所有套件都使用身份驗證,也並非所有身份驗證方法都需要證書。更進一步說,雖然消息默認使用 X.509 證書,但是也可以攜帶其他形式的標志;一些套件就依賴 PGP 密鑰

攜帶密鑰交換需要的額外數據。ServerKeyExchange 是可選的,消息內容對於不同的協商演算法套件會存在差異。部分場景下,比如使用 RSA 演算法時,伺服器不需要發送此消息。

ServerKeyExchange 僅在伺服器證書消息(也就是上述 Certificate 消息)不包含足夠的數據以允許客戶端交換預主密鑰(premaster secret)時才由伺服器發送。

比如基於 DH 演算法的握手過程中,需要單獨發送一條 ServerKeyExchange 消息帶上 DH 參數:

表明伺服器已經將所有預計的握手消息發送完畢。在此之後,伺服器會等待客戶端發送消息。

客戶端驗證證書的合法性,如果驗證通過才會進行後續通信,否則根據錯誤情況不同做出提示和操作,合法性驗證內容包括如下:

由 PKI 體系 的內容可知,對端發來的證書簽名是 CA 私鑰加密的,接收到證書後,先讀取證書中的相關的明文信息,採用相同的散列函數計算得到信息摘要,然後利用對應 CA 的公鑰解密簽名數據,對比證書的信息摘要,如果一致,則可以確認證書的合法性;然後去查詢證書的吊銷情況等

合法性驗證通過之後,客戶端計算產生隨機數字的預主密鑰(Pre-master),並用證書公鑰加密,發送給伺服器並攜帶客戶端為密鑰交換提供的所有信息。這個消息受協商的密碼套件的影響,內容隨著不同的協商密碼套件而不同。

此時客戶端已經獲取全部的計算協商密鑰需要的信息: 兩個明文隨機數 random_C 和 random_S 與自己計算產生的 Pre-master,然後得到協商密鑰(用於之後的消息加密)

圖中使用的是 ECDHE 演算法,ClientKeyExchange 傳遞的是 DH 演算法的客戶端參數,如果使用的是 RSA 演算法則此處應該傳遞加密的預主密鑰

通知伺服器後續的通信都採用協商的通信密鑰和加密演算法進行加密通信

Finished 消息意味著握手已經完成。消息內容將加密,以便雙方可以安全地交換驗證整個握手完整性所需的數據。

這個消息包含 verify_data 欄位,它的值是握手過程中所有消息的散列值。這些消息在連接兩端都按照各自所見的順序排列,並以協商得到的主密鑰 (enc_key) 計算散列。這個過程是通過一個偽隨機函數(pseudorandom function,PRF)來完成的,這個函數可以生成任意數量的偽隨機數據。
兩端的計算方法一致,但會使用不同的標簽(finished_label):客戶端使用 client finished,而伺服器則使用 server finished。

因為 Finished 消息是加密的,並且它們的完整性由協商 MAC 演算法保證,所以主動網路攻擊者不能改變握手消息並對 vertify_data 的值造假。在 TLS 1.2 版本中,Finished 消息的長度默認是 12 位元組(96 位),並且允許密碼套件使用更長的長度。在此之前的版本,除了 SSL 3 使用 36 位元組的定長消息,其他版本都使用 12 位元組的定長消息。

伺服器用私鑰解密加密的 Pre-master 數據,基於之前交換的兩個明文隨機數 random_C 和 random_S,同樣計算得到協商密鑰: enc_key = PRF(Pre_master, "master secret", random_C + random_S) ;

同樣計算之前所有收發信息的 hash 值,然後用協商密鑰解密客戶端發送的 verify_data_C,驗證消息正確性;

服務端驗證通過之後,伺服器同樣發送 change_cipher_spec 以告知客戶端後續的通信都採用協商的密鑰與演算法進行加密通信(圖中多了一步 New Session Ticket,此為會話票證,會在會話恢復中解釋);

伺服器也結合所有當前的通信參數信息生成一段數據 (verify_data_S) 並採用協商密鑰 session secret (enc_key) 與演算法加密並發送到客戶端;

客戶端計算所有接收信息的 hash 值,並採用協商密鑰解密 verify_data_S,驗證伺服器發送的數據和密鑰,驗證通過則握手完成;

開始使用協商密鑰與演算法進行加密通信。

HTTPS 通過 TLS 層和證書機制提供了內容加密、身份認證和數據完整性三大功能。加密過程中,需要用到非對稱密鑰交換和對稱內容加密兩大演算法。

對稱內容加密強度非常高,加解密速度也很快,只是無法安全地生成和保管密鑰。在 TLS 協議中,最後的應用數據都是經過對稱加密後傳輸的,傳輸中所使用的對稱協商密鑰(上文中的 enc_key),則是在握手階段通過非對稱密鑰交換而來。常見的 AES-GCM、ChaCha20-Poly1305,都是對稱加密演算法。

非對稱密鑰交換能在不安全的數據通道中,產生只有通信雙方才知道的對稱加密密鑰。目前最常用的密鑰交換演算法有 RSA 和 ECDHE。

RSA 歷史悠久,支持度好,但不支持 完美前向安全 - PFS(Perfect Forward Secrecy) ;而 ECDHE 是使用了 ECC(橢圓曲線)的 DH(Diffie-Hellman)演算法,計算速度快,且支持 PFS。

在 PKI 體系 一節中說明了僅有非對稱密鑰交換還是無法抵禦 MITM 攻擊的,所以需要引入了 PKI 體系的證書來進行身份驗證,其中服務端非對稱加密產生的公鑰會放在證書中傳給客戶端。

在 RSA 密鑰交換中,瀏覽器使用證書提供的 RSA 公鑰加密相關信息,如果服務端能解密,意味著服務端擁有與公鑰對應的私鑰,同時也能算出對稱加密所需密鑰。密鑰交換和服務端認證合並在一起。

在 ECDH 密鑰交換中,服務端使用私鑰 (RSA 或 ECDSA) 對相關信息進行簽名,如果瀏覽器能用證書公鑰驗證簽名,就說明服務端確實擁有對應私鑰,從而完成了服務端認證。密鑰交換則是各自發送 DH 參數完成的,密鑰交換和服務端認證是完全分開的。

可用於 ECDHE 數字簽名的演算法主要有 RSA 和 ECDSA - 橢圓曲線數字簽名演算法 ,也就是目前密鑰交換 + 簽名有三種主流選擇:

比如我的網站使用的加密套件是 ECDHE_RSA,可以看到數字簽名演算法是 sha256 哈希加 RSA 加密,在 PKI 體系 一節中講了簽名是伺服器信息摘要的哈希值加密生成的

內置 ECDSA 公鑰的證書一般被稱之為 ECC 證書,內置 RSA 公鑰的證書就是 RSA 證書。因為 256 位 ECC Key 在安全性上等同於 3072 位 RSA Key,所以 ECC 證書體積比 RSA 證書小,而且 ECC 運算速度更快,ECDHE 密鑰交換 + ECDSA 數字簽名是目前最好的加密套件

以上內容來自本文: 開始使用 ECC 證書

關於 ECC 證書的更多細節可見文檔: ECC Cipher Suites for TLS - RFC4492

使用 RSA 進行密鑰交換的握手過程與前面說明的基本一致,只是沒有 ServerKeyExchange 消息,其中協商密鑰涉及到三個參數 (客戶端隨機數 random_C、服務端隨機數 random_S、預主密鑰 Premaster secret),
其中前兩個隨機數和協商使用的演算法是明文的很容易獲取,最後一個 Premaster secret 會用伺服器提供的公鑰加密後傳輸給伺服器 (密鑰交換),如果這個預主密鑰被截取並破解則協商密鑰也可以被破解。

RSA 演算法的細節見: wiki 和 RSA演算法原理(二)- 阮一峰

RSA 的演算法核心思想是利用了極大整數 因數分解 的計算復雜性

而使用 DH(Diffie-Hellman) 演算法 進行密鑰交換,雙方只要交換各自的 DH 參數(在 ServerKeyExchange 發送 Server params,在 ClientKeyExchange 發送 Client params),不需要傳遞 Premaster secret,就可以各自算出這個預主密鑰

DH 的握手過程如下,大致過程與 RSA 類似,圖中只表達如何生成預主密鑰:

伺服器通過私鑰將客戶端隨機數 random_C,服務端隨機數 random_S,服務端 DH 參數 Server params 簽名生成 signature,然後在 ServerKeyExchange 消息中發送服務端 DH 參數和該簽名;

客戶端收到後用伺服器給的公鑰解密驗證簽名,並在 ClientKeyExchange 消息中發送客戶端 DH 參數 Client params;

服務端收到後,雙方都有這兩個參數,再各自使用這兩個參數生成預主密鑰 Premaster secret,之後的協商密鑰等步驟與 RSA 基本一致。

關於 DH 演算法如何生成預主密鑰,推薦看下 Wiki 和 Ephemeral Diffie-Hellman handshake

其核心思想是利用了 離散對數問題 的計算復雜性

演算法過程可以抽象成下圖:

雙方預先商定好了一對 P g 值 (公開的),而 Alice 有一個私密數 a(非公開,對應一個私鑰),Bob 有一個私密數 b(非公開,對應一個私鑰)

對於 Alice 和 Bob 來說通過對方發過來的公鑰參數和自己手中的私鑰可以得到最終相同的密鑰

而第三方最多知道 P g A B,想得到私鑰和最後的密鑰很困難,當然前提是 a b P 足夠大 (RFC3526 文檔中有幾個常用的大素數可供使用),否則暴力破解也有可能試出答案,至於 g 一般取個較小值就可以

如下幾張圖是實際 DH 握手發送的內容:

可以看到雙方發給對方的參數中攜帶了一個公鑰值,對應上述的 A 和 B

而且實際用的加密套件是 橢圓曲線 DH 密鑰交換 (ECDH) ,利用由橢圓曲線加密建立公鑰與私鑰對可以更進一步加強 DH 的安全性,因為目前解決橢圓曲線離散對數問題要比因式分解困難的多,而且 ECC 使用的密鑰長度比 RSA 密鑰短得多(目前 RSA 密鑰需要 2048 位以上才能保證安全,而 ECC 密鑰 256 位就足夠)

關於 橢圓曲線密碼學 - ECC ,推薦看下 A Primer on Elliptic Curve Cryptography - 原文 - 譯文

盡管可以選擇對任意一端進行身份驗證,但人們幾乎都啟用了對伺服器的身份驗證。如果伺服器選擇的套件不是匿名的,那麼就需要在 Certificate 消息中跟上自己的證書。

相比之下,伺服器通過發送 CertificateRequest 消息請求對客戶端進行身份驗證。消息中列出所有可接受的客戶端證書。作為響應,客戶端發送自己的 Certificate 消息(使用與伺服器發送證書相同的格式),並附上證書。此後,客戶端發送 CertificateVerify 消息,證明自己擁有對應的私鑰。

只有已經過身份驗證的伺服器才被允許請求客戶端身份驗證。基於這個原因,這個選項也被稱為相互身份驗證(mutual authentication)。

在 ServerHello 的過程中發出,請求對客戶端進行身份驗證,並將其接受的證書的公鑰和簽名演算法傳送給客戶端。

它也可以選擇發送一份自己接受的證書頒發機構列表,這些機構都用其可分辨名稱來表示:

在 ClientKeyExchange 的過程中發出,證明自己擁有的私鑰與之前發送的客戶端證書中的公鑰匹配。消息中包含一條到這一步為止的所有握手消息的簽名:

最初的會話恢復機制是,在一次完整協商的連接斷開時,客戶端和伺服器都會將會話的安全參數保存一段時間。希望使用會話恢復的伺服器為會話指定唯一的標識,稱為會話 ID(Session ID)。伺服器在 ServerHello 消息中將會話 ID 發回客戶端。

希望恢復早先會話的客戶端將適當的 Session ID 放入 ClientHello 消息,然後提交。伺服器如果同意恢復會話,就將相同的 Session ID 放入 ServerHello 消息返回,接著使用之前協商的主密鑰生成一套新的密鑰,再切換到加密模式,發送 Finished 消息。
客戶端收到會話已恢復的消息以後,也進行相同的操作。這樣的結果是握手只需要一次網路往返。

Session ID 由伺服器端支持,協議中的標准欄位,因此基本所有伺服器都支持,伺服器端保存會話 ID 以及協商的通信信息,佔用伺服器資源較多。

用來替代伺服器會話緩存和恢復的方案是使用會話票證(Session ticket)。使用這種方式,除了所有的狀態都保存在客戶端(與 HTTP Cookie 的原理類似)之外,其消息流與伺服器會話緩存是一樣的。

其思想是伺服器取出它的所有會話數據(狀態)並進行加密 (密鑰只有伺服器知道),再以票證的方式發回客戶端。在接下來的連接中,客戶端恢復會話時在 ClientHello 的擴展欄位 session_ticket 中攜帶加密信息將票證提交回伺服器,由伺服器檢查票證的完整性,解密其內容,再使用其中的信息恢復會話。

這種方法有可能使擴展伺服器集群更為簡單,因為如果不使用這種方式,就需要在服務集群的各個節點之間同步會話。
Session ticket 需要伺服器和客戶端都支持,屬於一個擴展欄位,佔用伺服器資源很少。

5. 緗戠粶錛堝洓錛夛細搴旂敤灞侶TTPS

緗戠粶錛堜竴錛夛細鍩虹鐭ヨ瘑
緗戠粶錛堜簩錛夛細浼犺緭灞俆CP銆乁DP
緗戠粶錛堜笁錛夛細搴旂敤灞侶TTP
緗戠粶錛堝洓錛夛細搴旂敤灞侶TTPS


HTTPS錛圚yper Text Transfer Protocol Secure錛夛紝瓚呮枃鏈浼犺緭瀹夊叏鍗忚錛岃捐HTTPS鐨勭洰鐨勫氨鏄涓轟簡瀹夊叏浼犺緭鏁版嵁銆侶TTPS鐨勯粯璁ょ鍙e彿鏄443錛孒TTP鐨勯粯璁ょ鍙e彿鏄80銆

HTTPS鏄瀹夊叏鐨勶紝浣嗗苟闈炴墍鏈夊叕鍙擱兘浣跨敤浜咹TTPS錛屽張鎴栬呭叕鍙告煇浜涙秹鍙婃晱鎰熸暟鎹鐨勮鋒眰鎵嶄嬌鐢ㄤ簡HTTPS銆佸叾瀹冭繕鏄浣跨敤HTTP錛岃繖鏄鍥犱負浣跨敤HTTPS鏄鏈夋垚鏈鐨勶細


HTTPS涔熷父琚縐頒負HTTP over SSL鎴朒TTP over TLS錛屽嵆浣跨敤浜哠SL鐨凥TTP鎴栦嬌鐢ㄤ簡TLS鐨凥TTP銆

TLS錛圱ransport Layer Security錛夛紝浼犺緭灞傚畨鍏ㄥ崗璁錛屽畠鐨勫墠韜灝辨槸SSL錛圫ecure Socket Layer錛夛紝瀹夊叏濂楁帴灞傚崗璁銆傚巻鍙茬増鏈淇℃伅錛

SSL/TLS宸ヤ綔鍦ㄥ簲鐢ㄥ眰鍜屼紶杈撳眰涔嬮棿錛屽簲鐢ㄥ眰鐨勬暟鎹浼氫嬌鐢⊿SL/TLS鐢熸垚鐨勫瘑閽ュ姞瀵嗗悗鍐嶄紶閫掔粰浼犺緭灞傦紝浠庤屼繚璇佷簡鏁版嵁鍦ㄤ紶杈撹繃紼嬩腑鐨勫畨鍏ㄦс


HTTPS鐨勯氫俊榪囩▼鍙浠ュ垎涓哄洓澶ч樁孌碉細

鎺ヤ笅鏉ユ垜浠灝辯湅涓涓婽LS鏄鎬庝箞鐢熸垚鍜屼紶杈撳圭О鍔犲瘑瀵嗛掗鐨勶紝榪欎釜榪囩▼浼氭湁鍗佹″叧閿鐨勬彙鎵嬶紝鎴戜滑鐪佺暐浜嗕竴浜涗笉鍏沖績鐨凙CK錛

瀹㈡埛絝浼氱粰鏈嶅姟鍣ㄥ彂閫佷竴涓 Client Hello 娑堟伅錛岃ユ秷鎮鍐呴儴鍖呭惈TLS鐨勭増鏈鈥斺旂敤鏉ュ憡璇夋湇鍔″櫒瀹㈡埛絝鎯充嬌鐢ㄥ摢涓鐗堟湰鐨凾LS錛屽寘鍚鏀鎸佺殑鍔犲瘑濂椾歡鈥斺旂敤鏉ュ憡璇夋湇鍔″櫒瀹㈡埛絝鏀鎸佸摢浜涘瘑閽ヤ氦鎹㈢畻娉曚互鍙婃敮鎸佸摢浜涘姞瀵嗙畻娉曘佹秷鎮鎽樿佺畻娉曪紝鍖呭惈涓涓闅忔満鏁癈lient Random鈥斺斿皢鏉ョ敤鏉ョ敓鎴愬圭О鍔犲瘑鐨勫瘑閽ャ

鏈嶅姟鍣ㄤ細緇欏㈡埛絝鍙戦佷竴涓 Server Hello 娑堟伅錛岃ユ秷鎮鍐呴儴鍖呭惈TLS鐨勭増鏈鈥斺旂敤鏉ュ憡璇夊㈡埛絝鏈嶅姟鍣ㄦ兂浣跨敤鍝涓鐗堟湰鐨凾LS錛屽寘鍚閫夋嫨鐨勫姞瀵嗗椾歡鈥斺旂敤鏉ュ憡璇夊㈡埛絝鏈嶅姟鍣ㄩ夋嫨浜嗗摢涓濂楀瘑閽ヤ氦鎹㈢畻娉曚互鍙婂摢涓濂楀姞瀵嗙畻娉曘佹秷鎮鎽樿佺畻娉曪紙鍋囪鵑夋嫨浜員LS_ECDHE_ECDSA_...錛夛紝鍖呭惈涓涓闅忔満鏁癝erver Random鈥斺斿皢鏉ョ敤鏉ョ敓鎴愬圭О鍔犲瘑鐨勫瘑閽ャ

鏈嶅姟鍣ㄤ細緇欏㈡埛絝鍙戦佷竴涓 Certificate 娑堟伅鈥斺 鏈嶅姟鍣ㄤ細鎶婂湪CA璁よ瘉榪囩殑璇佷功錛堝寘鍚鍏閽ャ佸叕閽ョ殑鏁板瓧絳懼悕絳変俊鎮錛夊彂緇欏㈡埛絝錛屽㈡埛絝浼氱敤CA鍏閽ユ潵楠岃瘉騫惰幏鍙栧埌鍏閽ワ紝榪欎釜鍏閽ュ氨鏄灝嗘潵闈炲圭О鍔犲瘑瑕佺敤鍒扮殑鍏閽ャ

鏈嶅姟鍣ㄤ細緇欏㈡埛絝鍙戦佷竴涓 Server Key Exchange 娑堟伅鈥斺 瀵圭О鍔犲瘑鐨勫瘑閽ヤ氦鎹㈢畻娉旹CDHE_ECDSA闇瑕佷竴浜涘弬鏁幫紝鏈嶅姟鍣ㄩ渶瑕佹彁渚涗竴閮ㄥ垎銆佸苟鍙戠粰瀹㈡埛絝錛屾垜浠鎶婃湇鍔″櫒鎻愪緵鐨勮繖閮ㄥ垎鍙傛暟縐頒箣涓篠erver Params銆

鏈嶅姟鍣ㄤ細緇欏㈡埛絝鍙戦佷竴涓 Server Hello Done 娑堟伅鈥斺 鏈嶅姟鍣ㄥ憡璇夊㈡埛絝鏈嶅姟鍣ㄥ凡緇忔病浠涔堝崗鍟嗘暟鎹闇瑕佸彂緇欏㈡埛絝浜嗐

瀹㈡埛絝浼氱粰鏈嶅姟鍣ㄥ彂閫佷竴涓 Client Key Exchange 娑堟伅鈥斺斿圭О鍔犲瘑鐨勫瘑閽ヤ氦鎹㈢畻娉旹CDHE_ECDSA闇瑕佷竴浜涘弬鏁幫紝瀹㈡埛絝闇瑕佹彁渚涗竴閮ㄥ垎銆佸苟鍙戠粰鏈嶅姟鍣錛屾垜浠鎶婂㈡埛絝鎻愪緵鐨勮繖閮ㄥ垎鍙傛暟縐頒箣涓篊lient Params銆

瀹㈡埛絝浼氱粰鏈嶅姟鍣ㄥ彂閫佷竴涓 Change Cipher Spec 娑堟伅鈥斺斿㈡埛絝鍛婅瘔鏈嶅姟鍣ㄤ互鍚庡㈡埛絝鍙戠粰鏈嶅姟鍣ㄧ殑鏁版嵁閮戒細鐢ㄥ圭О鍔犲瘑鐨勫瘑閽ヨ繘琛屽姞瀵嗐

瀹㈡埛絝浼氱粰鏈嶅姟鍣ㄥ彂閫佷竴涓 Finished 娑堟伅鈥斺斿㈡埛絝浼氭妸絎涓嬈TLS鎻℃墜 ~ 絎涓冩TLS鎻℃墜鍏ㄩ儴鐨勬暟鎹鐢熸垚涓涓鎽樿侊紝鐒跺悗鍐嶆妸榪欎釜鎽樿佺敤瀵圭О鍔犲瘑瀵嗛掗1鍔犲瘑涔嬪悗鍙戦佺粰鏈嶅姟鍣錛岀洰鐨勫氨鏄涓轟簡璁╂湇鍔″櫒鍘昏В瀵嗭紝榪涜屽垽瀹氬圭О鍔犲瘑瀵嗛掗1鑳芥湁鏁堝姞瑙e瘑銆

鏈嶅姟鍣ㄤ篃浼氱粰瀹㈡埛絝鍙戦佷竴涓 Change Cipher Spec 娑堟伅鈥斺旀湇鍔″櫒鍛婅瘔瀹㈡埛絝浠ュ悗鏈嶅姟鍣ㄥ彂緇欏㈡埛絝鐨勬暟鎹涔熼兘浼氱敤瀵圭О鍔犲瘑瀵嗛掗2榪涜屽姞瀵嗐

鏈嶅姟鍣ㄤ細緇欏㈡埛絝鍙戦佷竴涓 Finished 娑堟伅鈥斺旀湇鍔″櫒浼氭妸絎涓嬈TLS鎻℃墜 ~ 絎涔濇TLS鎻℃墜鍏ㄩ儴鐨勬暟鎹鐢熸垚涓涓鎽樿侊紝鐒跺悗鍐嶆妸榪欎釜鎽樿佺敤瀵圭О鍔犲瘑瀵嗛掗2鍔犲瘑涔嬪悗鍙戦佺粰瀹㈡埛絝錛岀洰鐨勫氨鏄涓轟簡璁╁㈡埛絝鍘昏В瀵嗭紝榪涜屽垽瀹氬圭О鍔犲瘑瀵嗛掗2鑳芥湁鏁堝姞瑙e瘑銆

6. 鏁版嵁鍔犲瘑鏂瑰紡鏈夊摢浜

鏁版嵁鍔犲瘑鏂瑰紡鏈夛細鍗曞悜鍔犲瘑銆佸圭О鍔犲瘑銆侀潪瀵圭О鍔犲瘑銆佸搱甯屽姞瀵嗐丼SL/TLS鍔犲瘑銆佹暟瀛楃懼悕銆佹暟瀛楁椂闂存埑絳夈

1銆佸崟鍚戝姞瀵

閫氳繃瀵規暟鎹榪涜屾憳瑕佽$畻鐢熸垚瀵嗘枃錛屽瘑鏂囦笉鍙閫嗘帹榪樺師銆傚彧鑳藉姞瀵嗭紝涓嶈兘瑙e瘑錛屽父鐢ㄤ簬鎻愬彇鏁版嵁鐨勬寚綰逛俊鎮浠ユゆ潵楠岃瘉鏁版嵁鐨勫畬鏁存с

閱讀全文

與tls摘要演算法相關的資料

熱點內容
java轉php的時間戳 瀏覽:635
編譯libstdc依賴 瀏覽:655
清演算法人與原法人的區別 瀏覽:407
家庭裝修下載什麼app軟體 瀏覽:572
美食博主用什麼app拍視頻 瀏覽:813
ipone手機如何加密微信 瀏覽:354
自來水加密閥閥帽 瀏覽:431
華為交換機dhcp配置命令 瀏覽:315
androidbitmap縮小 瀏覽:271
單片機串口控制燈 瀏覽:84
大訊雲伺服器安裝視頻 瀏覽:784
華為演算法領先世界 瀏覽:654
linux路由重啟 瀏覽:566
php的模板編程 瀏覽:322
編譯器原理與實現書 瀏覽:711
dos選擇命令 瀏覽:19
apm固件編譯到單片機 瀏覽:123
聯通深藍卡都包含什麼app 瀏覽:266
如何判斷網路伺服器正常 瀏覽:652
路由器搭橋遠端伺服器地址是什麼 瀏覽:518