Chrome是如何實現TLS協議的

2021-08-08 20:29:52 字數 2022 閱讀 7753

chromium是如何實現tls協議的

說起tls(transport layer security) 協議大家可能不是那麼熟悉,但是說起https協議,大家肯定都或多或少聽過。記得之前有個梗,要把伺服器的應用層協議從http切到https,有人說了,加個「s」不就可以了,一句話的事情……,實際上我一開始我也以為https只不過比http多了乙個「s」而已,這句話還真毛病,但並不是簡單的在後面加個「s」就完事了,實際上這裡的「s」就是我們今天要介紹的tls協議。

tls協議的前身是ssl協議,後者的全稱是 socket security layer,可以看到兩者都涉及到了安全,實際上tls協議的目標就是解決以下幾個問題:

**資訊被竊聽(wiretap),第三方隨時隨地獲得通訊內容;

ssl/tls 實現了傳輸資訊的加密。

資料被篡改(tampering),第三方可修改傳輸中的資料;

ssl/tls 實現了資料簽名及校驗。

身份被冒充(pretending),第三方可冒充通訊者身份傳輸資料;

ssl/tls 採用了ca數字證書認證機制。**

我們今天就從理論層面、生產環節下的實際表現以及chromium的**實現這三個維度來詳細地分析tls協議,看看它究竟是如何實現上面這三方面的。

關於tls協議的過程,大家肯定都知道tcp的三次握手,tls也有類似的握手過程,和tcp為了建立穩定連線才進行握手類似,tls協議也要進行客戶端與服務端之間的通訊,而通訊的內容,就是在整個tls協議中最為重要的金鑰。這裡的金鑰是客戶端和服務端動態生成,然後通過資訊互動的方式保持一致,在這裡涉及到很多安全學和密碼學的知識,例如各種加密演算法,動態金鑰演算法等等,有興趣的同學可以去關注一下這方面的知識,在這裡就不再贅述了。大致的握手流程如下:

客戶端發出乙個 client hello 訊息,攜帶的資訊包括:

所支援的ssl/tls 版本列表;支援的加密演算法;所支援的資料壓縮方法;客戶端生成的隨機數a;

服務端響應乙個 server hello 訊息,攜帶的資訊包括:

協商採用的ssl/tls 版本號;會話id;伺服器端生成的隨機數b;服務端數字證書 serverca;

由於雙向認證需求,服務端需要對客戶端進行認證,會同時傳送乙個 client certificate request,表示請求客戶端的證書;

客戶端校驗服務端的數字證書;校驗通過之後傳送隨機數c,該隨機數稱為pre-master-key,使用數字證書中的公鑰加密後發出;

由於服務端發起了 client certificate request,客戶端使用私鑰加密乙個隨機數 clientrandom隨客戶端的證書 clientca一併發出;

服務端校驗客戶端的證書,並成功將客戶端加密的隨機數clientrandom 解密;

根據隨機數a/隨機數b/隨機數c(pre-master-key) 產生動態金鑰 master-key,加密乙個finish 訊息發至客戶端;

客戶端根據同樣的隨機數和演算法 生成master-key,加密乙個finish 訊息傳送至服務端;

服務端和客戶端分別解密成功,至此握手完成,之後的資料報均採用master-key進行加密傳輸。

下面這張圖更為直觀地將整個過程表現了出來:

可以看到,整個過程至少需要兩個rtt(往返時延)才可以完成認證,也就是說至少要兩個rtt以後客戶端才可以向服務端傳送請求,如果再加上tcp三次握手用去的1個rtt,那麼一共就要3個rtt後才可以進行資料的傳輸,這顯然大大降低了傳輸效率,因此tls協議也在不斷地優化其速度,這也是未來tls協議的乙個重要研究方向,後續我們講到優化的時候會著重再講這部分的。

這就是乙個典型的三次握手過程,客戶端傳送syn報文,服務端受到後發syn ack報文,然後客戶端發相應的ack回應報文,想學習tcp的同學強烈建議你們去試一下,絕對比你看書學得更快,更牢固。

接下來我們就來看一下tls協議的交換,

搖桿是如何實現的

大家在玩手機網遊的時候都注意過移動人物的前後左右鍵,那麼它是如何實現的呢?今天博主就為大家揭開這個迷惑 首先我們要建立兩個父子關係的image,通過source image分別將他們模型放進去 接下來我們通過指令碼來控制搖桿 首先我們要引入乙個命名空間 using unityengine.event...

AOP是如何實現的?

spring中的aop 還是離不開spring的ioc容器,的生成,管理及其依賴關係都是由ioc容器負責 spring預設使用jdk動態 在需要 類而不是 介面的時候,spring會自動切換為使用cglib 不過現在的專案都是面向介面程式設計,所以jdk動態 相對來說用的還是多一些。類實現invoc...

keepalived是如何實現MySQL高可用的?

script opt dtstack dtagent agent mysqlha check alive.py 3306 interval 11 check every 2 seconds fall 3 require 2 failures for ko rise 3 require 2 succe...