聲明:圖檔來自 github:https://github.com/russelltao/geektime-nginx
SSL協定握手時Nginx的性能瓶頸在哪裡?
TLS通訊過程
- 通訊過程中雙方主要想完成四個目的
- 驗證身份
- 達成安全套件共識
- 傳遞并生成密鑰
- 加密通訊
![]()
Nginx學習筆記之SSL協定握手時Nginx的性能瓶頸在哪裡?
- ①浏覽器向伺服器發送Client Hello的消息
- 因為我們的浏覽器是非常多樣化的,比如Firefox,IE,Chrome,而且浏覽器的版本在不停地變更,是以不同的浏覽器它所支援的安全套件,加密算法都是不同的。這一步告訴伺服器我支援哪些算法。
- ②Sever Hello 我們的Nginx它會有一個自己支援的加密算法的清單以及它傾向于使用哪一個加密算法套件,這裡Nginx它會選擇一套它最喜歡的加密套件發送給用戶端
- 如果我們想複用session也就是Nginx打開了session cache,希望在一天内端口連接配接的用戶端不用再次協商秘鑰,可以直接複用之前的秘鑰
- Sever Hello資訊中主要發送究竟我們選擇哪一個安全套件。
- ③Nginx會把自己的公鑰證書發送給浏覽器
- 這個公鑰證書中是包含證書鍊的,是以浏覽器可以找到自己的根證書庫區驗證證書是否是有效的
- ④伺服器會發送Sever Hello Done
- 如果我們之前協商的安全套件,比如之前提到的橢圓曲線算法,這時需要在第三步和第四步之間把橢圓曲線的參數發送給用戶端,友善我們在第六步生成最終加密加密所需的秘鑰
- ⑤用戶端也需要根據橢圓曲線的公共參數生成自己的私鑰以後,把公鑰發送給伺服器,
- ⑥Key generation
- 伺服器有自己的私鑰,把公鑰發送給用戶端,可以根據自己的私鑰,和用戶端的公鑰共同生成雙方加密的秘鑰,這一步由伺服器制作的,
- 用戶端根據伺服器發來的公鑰和自己的生成的私鑰,也可以生成一個秘鑰
- 伺服器和用戶端各自生成的秘鑰是相同的,這是由非對稱加密算法保證的。
- 接下來就可以用這一步生成的秘鑰進行加密,進行資料通信。
- 從這個過程中,我們可以看到,TLS通訊主要在做兩件事:
- 第一件是交換秘鑰
- 第二是加密資料
- 是以最消耗性能的也是這兩點
- Nginx是怎樣優化它的性能?
- 這裡我們主要看它的算法性能,Nginx在握手的時候,主要看它的橢圓加密算法和RSA非對稱加密算法這樣的性能
- 如下圖,對于小檔案,握手時主要影響它性能的主要名額
![]()
Nginx學習筆記之SSL協定握手時Nginx的性能瓶頸在哪裡?
- 如下圖,對于大檔案,就會考慮對稱加密算法的性能,比如說AES,對稱加密性能雖然很好,但是對于一個非常大的檔案,我們去測吞吐量的時候,相對于其他算法,AES性能還是比較好的,它可以達到一個資料的極限
![]()
Nginx學習筆記之SSL協定握手時Nginx的性能瓶頸在哪裡?
- Nginx的綜合性能
- 當以小檔案為主時,主要考驗的是Nginx的非對稱加密的性能,比如說RSA
- 當我們處理大檔案時,主要考慮對稱加密算法的性能,比如說AES。
- 如果我們處于小檔案比較多的情況下,重點可能就是優化橢圓曲線算法的一些密碼強度是不是可以有所降低;
- 當我們面對大的檔案處理的時候,可以考慮是否可将AES算法替換為更有效的算法或者把密碼強度調的更小一些
![]()
Nginx學習筆記之SSL協定握手時Nginx的性能瓶頸在哪裡?