1 前言
HTTPS在保護用戶隱私,防止流量劫持方面發揮著非常關鍵的作用,但與此同時,HTTPS也會降低用戶訪問速度,增加網站服務器的計算資源消耗。
本文主要介紹https對用戶體驗的影響。
本文最早發表於百度運維部官方博客
2 HTTPS對訪問速度的影響
在介紹速度優化策略之前,先來看下HTTPS對速度有什麼影響。影響主要來自兩方面:
1. 協議交互所增加的網絡RTT(round trip time)。
2. 加解密相關的計算耗時。
下面分別介紹一下。
2.1 網絡耗時增加
由於 HTTP和HTTPS都需要DNS解析,並且大部分情況下使用了DNS緩存,為了突出對比效果,忽略主域名的DNS解析時間。
用戶使用HTTP協議訪問http://www.baidu.com(或者www.baidu.com)時會有如下網絡上的交互耗時:
可見,用戶只需要完成TCP三次握手建立TCP連接就能夠直接發送HTTP請求獲取應用層數據,此外在整個訪問過程中也沒有需要消耗計算資源的地方。
接下來看HTTPS的訪問過程,相比HTTP要復雜很多,在部分場景下,使用HTTPS訪問有可能增加7個RTT。如下圖:
HTTPS首次請求需要的網絡耗時解釋如下:
1. 三次握手建立TCP連接。耗時一個RTT。
2. 使用HTTP發起GET請求,服務端返回302跳轉到https://www.baidu.com。需要一個RTT以及302跳轉延時。
a) 大部分情況下用戶不會手動輸入https://www.baidu.com來訪問HTTPS,服務端只能返回302強制浏覽器跳轉到https。
b) 浏覽器處理302跳轉也需要耗時。
3. 三次握手重新建立TCP連接。耗時一個RTT。
a) 302跳轉到HTTPS服務器之後,由於端口和服務器不同,需要重新完成三次握手,建立TCP連接。
4. TLS完全握手階段一。耗時至少一個RTT。
a) 這個階段主要是完成加密套件的協商和證書的身份認證。
b) 服務端和浏覽器會協商出相同的密鑰交換算法、對稱加密算法、內容一致性校驗算法、證書簽名算法、橢圓曲線(非ECC算法不需要)等。
c) 浏覽器獲取到證書後需要校驗證書的有效性,比如是否過期,是否撤銷。
5. 解析CA站點的DNS。耗時一個RTT。
a) 浏覽器獲取到證書後,有可能需要發起OCSP或者CRL請求,查詢證書狀態。
b) 浏覽器首先獲取證書裡的CA域名。
c) 如果沒有命中緩存,浏覽器需要解析CA域名的DNS。
6. 三次握手建立CA站點的TCP連接。耗時一個RTT。
a) DNS解析到IP後,需要完成三次握手建立TCP連接。
7. 發起OCSP請求,獲取響應。耗時一個RTT。
8. 完全握手階段二,耗時一個RTT及計算時間。
a) 完全握手階段二主要是密鑰協商。
9. 完全握手結束後,浏覽器和服務器之間進行應用層(也就是HTTP)數據傳輸。
當然不是每個請求都需要增加7個RTT才能完成HTTPS首次請求交互。大概只有不到0.01%的請求才有可能需要經歷上述步驟,它們需要滿足如下條件:
1. 必須是首次請求。即建立TCP連接後發起的第一個請求,該連接上的後續請求都不需要再發生上述行為。
2. 必須要發生完全握手,而正常情況下80%的請求能實現簡化握手。
3. 浏覽器需要開啟OCSP或者CRL功能。Chrome默認關閉了ocsp功能,firefox和IE都默認開啟。
4. 浏覽器沒有命中OCSP緩存。Ocsp一般的更新周期是7天,firefox的查詢周期也是7天,也就說是7天中才會發生一次ocsp的查詢。
5. 浏覽器沒有命中CA站點的DNS緩存。只有沒命中DNS緩存的情況下才會解析CA的DNS。
2.2 計算耗時增加
上節還只是簡單描述了HTTPS關鍵路徑上必須消耗的純網絡耗時,沒有包括非常消耗CPU資源的計算耗時,事實上計算耗時也不小(30ms以上),從浏覽器和服務器的角度分別介紹一下:
1, 浏覽器計算耗時
a) RSA證書簽名校驗,浏覽器需要解密簽名,計算證書哈希值。如果有多個證書鏈,浏覽器需要校驗多個證書。
b) RSA密鑰交換時,需要使用證書公鑰加密premaster。耗時比較小,但如果手機性能比較差,可能也需要1ms的時間。
c) ECC密鑰交換時,需要計算橢圓曲線的公私鑰。
d) ECC密鑰交換時,需要使用證書公鑰解密獲取服務端發過來的ECC公鑰。
e) ECC密鑰交換時,需要根據服務端公鑰計算master key。
f) 應用層數據對稱加解密。
g) 應用層數據一致性校驗。
2, 服務端計算耗時
a) RSA密鑰交換時需要使用證書私鑰解密premaster。這個過程非常消耗性能。
b) ECC密鑰交換時,需要計算橢圓曲線的公私鑰。
c) ECC密鑰交換時,需要使用證書私鑰加密ECC的公鑰。
d) ECC密鑰交換時,需要根據浏覽