上文講到HTTPS對用戶訪問速度的影響。
本文就為大家介紹HTTPS在訪問速度,計算性能,安全等方面基于協議和配置的優化。
HTTPS訪問速度優化Tcpfastopen
HTTPS和HTTP使用TCP協議進行傳輸,也就意味著必須通過三次握手建立TCP連接,但一個RTT的時間內只傳輸一個syn包是不是太浪費?能不能在syn包發出的同時捎上應用層的數據?其實是可以的,這也是tcpfastopen的思路,簡稱TFO。具體原理可以參考rfc7413。
遺憾的是TFO需要高版本內核的支持,linux從3.7以后支持TFO,但是目前的windows系統還不支持TFO,所以只能在公司內部服務器之間發揮作用。
HSTS
前面提到過將用戶HTTP請求302跳轉到HTTPS,這會有兩個影響:
不安全,302跳轉不僅暴露了用戶的訪問站點,也很簡單被中間者支持。降低訪問速度,302跳轉不僅需要一個RTT,瀏覽器執行跳轉也需要執行時間。
由于302跳轉事實上是由瀏覽器觸發的,服務器無法完全控制,這個需求導致了HSTS的誕生:
HSTS(HTTPStrictTransportSecurity)。服務端返回一個HSTS的httpheader,瀏覽器獲取到HSTS頭部之后,在一段時間內,不管用戶輸入還是都會默認將請求內部跳轉成
Chrome,firefox,ie都支持了HSTS(caniuse.com/#feat=stricttransportsecurity)。Sessionresume
Sessionresume顧名思義就是復用session,實現簡化握手。復用session的好處有兩個:
減少了CPU消耗,因為不需要進行非對稱密鑰交換的計算。提升訪問速度,不需要進行完全握手階段二,節省了一個RTT和計算耗時。
TLS協議目前提供兩種機制實現sessionresume,分別介紹一下。
Sessioncache
Sessioncache的原理是使用clienthello中的sessionid查詢服務端的sessioncache,假如服務端有對應的緩存,則直接使用已有的session信息提前完成握手,稱為簡化握手。
Sessioncache有兩個缺點:
需要消耗服務端內存來存儲session內容。目前的開源軟件包括nginx,apache只支持單機多進程間共享緩存,不支持多機間分布式緩存,對于百度或者其他大型互聯網公司而言,單機sessioncache幾乎沒有作用。
Sessioncache也有一個非常大的優點:
sessionid是TLS協議的標準字段,市面上的瀏覽器全部都支持sessioncache。
百度通過對TLS握手協議及服務器端實現的優化,已經支持全局的sessioncache,能夠明顯提升用戶的訪問速度,節省服務器計算資源。
Sessionticket
上節提到了sessioncache的兩個缺點,sessionticket能夠彌補這些不足。
Sessionticket的原理參考RFC4507。簡述如下:
server將session信息加密成ticket發送給瀏覽器,瀏覽器后續握手請求時會發送ticket,server端假如能成功解密和處理ticket,就能完成簡化握手。
顯然,sessionticket的優點是不需要服務端消耗大量資源來存儲session內容。
Sessionticket的缺點:
sessionticket只是TLS協議的一個擴展特性,目前的支持率不是很廣泛,只有60%左右。sessionticket需要維護一個全局的key來加解密,需要考慮KEY的安全性和部署效率。
總體來講,sessionticket的功能特性明顯優于sessioncache。希望客戶端實現優先支持sessionticket。
Ocspstapling
Ocsp全稱在線證書狀態檢查協議(rfc6960),用來向CA站點查詢證書狀態,比如是否撤銷。通常情況下,瀏覽器使用OCSP協議發起查詢請求,CA返回證書狀態內容,然后瀏覽器接受證書是否可信的狀態。
這個過程非常消耗時間,因為CA站點有可能在國外,網絡不穩定,RTT也比較大。那有沒有辦法不直接向CA站點請求OCSP內容呢?ocspstapling就能實現這個功能。
具體介紹參考RFC6066第8節。簡述原理就是瀏覽器發起clienthello時會攜帶一個certificatestatusrequest的擴展,服務端看到這個擴展后將OCSP內容直接返回給瀏覽器,完成證書狀態檢查。
由于瀏覽器不需要直接向CA站點查詢證書狀態,這個功能對訪問速度的提升非常明顯。
Nginx目前已經支持這個ocspstaplingfile,只需要配置ocspstaplingfile的指令就能開啟這個功能:
Falsestart
通常情況下,應用層數據必須等完全握手全部結束之后才能傳輸。這個其實比較浪費時間,那能不能類似TFO一樣,在完全握手的第二個階段將應用數據一起發出來呢?google提出了falsestart來實現這個功能。具體介紹參考tools.ietf.org/html/draft-bmoeller-tls-
falsestart-00。
簡單概括Falsestart的原理就是在client_key_exchange發出時將應用層數據一起發出來,能夠節省一個RTT。
Falsestart依靠于PFS(perfectforwardsecrecy完美前向加密),而PFS又依靠于DHE密鑰交換系列算法(DHE_RSA,ECDHE_RSA,DHE_DSS,ECDHE_ECDSA),所以盡量優先支持ECDHE密鑰交換算法實現falsestart。
使用SPDY或者HTTP2
SPDY是google推出的優化HTTP傳輸效率的協議(它基本上沿用了HTTP協議的語義,但是通過使用幀控制實現了多個特性,顯著提升了HTTP協議的傳輸效率。
SPDY很大的特性就是多路復用,能將多個HTTP請求在同一個連接上一起發出去,不像目前的HTTP協議一樣,只能串行地逐個發送請求。Pipeline雖然支持多個請求一起發送,但是接收時依然得按照順序接收,本質上無法解決并發的問題。
HTTP2是IETF2020年2月份通過的HTTP下一代協議,它以SPDY為原型,經過兩年多的討論和完善很終確定。
本文就不過多介紹SPDY和HTTP2的收益,需要說明兩點:
SPDY和HTTP2目前的實現默認使用HTTPS協議。SPDY和HTTP2都支持現有的HTTP語義和API,對WEB應用幾乎是透明的。

Google公布chrome瀏覽器2021年將放棄SPDY協議,全面支持HTTP2,但是目前國內部分瀏覽器廠商進度非常慢,不僅不支持HTTP2,連SPDY都沒有支持過。
百度服務端和百度手機瀏覽器現在都已經支持SPDY3.1協議。HTTPS計算性能優化優先使用ECC
ECC橢圓加密算術相比普通的離散對數計算速度性能要強很多。下表是NIST推薦的密鑰長度對照表。
對稱密鑰大小|RSA和DH密鑰大小|ECC密鑰大小
----|------|----80|1024|160|112|2048|224128|3072|256192|7680|384256|15360|521表格2NIST推薦使用的密鑰長度
對于RSA算法來講,目前至少使用2048位以上的密鑰長度才能保證安全性。ECC只需要使用224位長度的密鑰就能實現RSA2048位長度的安全強度。在進行相同的模指數運算時速度顯然要快很多。
使用很新版的openssl
一般來講,新版的openssl相比老版的計算速度和安全性都會有提升。比如openssl1.0.2采用了intel很新的優化成果,橢圓曲線p256的計算性能提升了4倍。(eprint.iacr.org/2021/816.pdf)
Openssl2021年就升級了5次,基本都是為了修復實現上的BUG或者算法上的漏洞而升級的。所以盡量使用很新版本,避免安全上的風險。
硬件加速方案
現在比較常用的TLS硬件加速方案主要有兩種:
SSL專用加速卡。GPUSSL加速。上述兩個方案的主流用法都是將硬件插入到服務器的PCI插槽中,由硬件完成很消耗性能的計算。但這樣的方案有如下缺點:支持算法有限。比如不支持ECC,不支持GCM等。升級成本高。出現新的加密算法或者協議時,硬件加速方案無法及時升級。出現比較大的安全漏洞時,部分硬件方案在無法在短期內升級解決。比如2021年暴露的heartbleed漏洞。無法充分利用硬件加速性能。硬件加速程序一般都運行在內核態,計算結果傳遞到應用層需要IO和內存拷貝開銷,即使硬件計算性能非常好,上層的同步等待和IO開銷也會導致整體性能達不到預期,無法充分利用硬件加速卡的計算能力。維護性差。硬件驅動及應用層API大部分是由安全廠家提供,出現問題后還需要廠家跟進。用戶無法把握核心代碼,比較被動。不像開源的openssl,不管算法還是協議,用戶都能把握。TLS遠程代理計算
也正是因為上述原因,百度實現了專用的SSL硬件加速集群。基本思路是:
優化TLS協議棧,剝離很消耗CPU資源的計算,主要有如下部分:RSA中的加解密計算。ECC算法中的公私鑰生成。ECC算法中的共享密鑰生成。優化硬件計算部分。硬件計算不涉及協議及狀態交互,只需要處理大數運算。Webserver到TLS計算集群之間的任務是異步的。即webserver將待計算內容發送給加速集群后,依然可以繼續處理其他請求,整個過程是異步非阻塞的。HTTPS安全配置協議版本選擇
SSL2.0早就被證實是不安全的協議了,統計發現目前已經沒有客戶端支持SSL2.0,所以可以放心地在服務端禁用SSL2.0協議。
2021年爆發了POODLE攻擊,SSL3.0因此被證實是不安全的。但是統計發現依然有0.5%的流量只支持SSL3.0。所以只能有選擇地支持SSL3.0。
TLS1.1及1.2目前為止沒有發現安全漏洞,建議優先支持。

加密套件選擇
加密套件包含四個部分:
非對稱密鑰交換算法。建議優先使用ECDHE,禁用DHE,次優先選擇RSA。證書簽名算法。由于部分瀏覽器及操作系統不支持ECDSA簽名,目前默認都是使用RSA簽名,其中SHA1簽名已經不再安全,chrome及微軟2021年開始不再支持SHA1簽名的證書(googleonlinesecurity.blogspot.jp/2021/09/gradually-sunsetting-sha-1.html)。對稱加解密算法。優先使用AES-GCM算法,針對1.0以上協議禁用RC4(rfc7465)。內容一致性校驗算法。Md5和sha1都已經不安全,建議使用sha2以上的安全哈希函數。HTTPS防攻擊防止協議降級攻擊
降級攻擊一般包括兩種:加密套件降級攻擊(ciphersuiterollback)和協議降級攻擊(versionrollback)。降級攻擊的原理就是攻擊者偽造或者修改clienthello消息,使得客戶端和服務器之間使用比較弱的加密套件或者協議完成通信。
為了應對降級攻擊,現在server端和瀏覽器之間都實現了SCSV功能,原理參考tools.ietf.org/html/draft-ietf-tls-downgrade-scsv-00。

一句話解釋就是假如客戶端想要降級,必須發送TLS_SCSV的信號,服務器假如看到TLS_SCSV,就不會接受比服務端很高協議版本低的協議。
防止重新協商攻擊
重新協商(tlsrenegotiation)分為兩種:加密套件重協商(ciphersuiterenegotiation)和協議重協商(protocolrenegotiation)。
重新協商會有兩個隱患:
重協商后使用弱的安全算法。這樣的后果就是傳輸內容很簡單泄露。重協商過程中不斷發起完全握手請求,觸發服務端進行高強度計算并引發服務拒絕。對于重協商,很直接的保護手段就是禁止客戶端主動重協商,當然出于尤其場景的需求,應該答應服務端主動發起重協商。結束語
HTTPS的實踐和優化涉及到了非常多的知識點,由于篇幅關系,本文對很多優化策略只是簡單介紹了一下.假如想要了解協議背后的原理,還是需要具體閱讀TLS協議及PKI知識。對于大型站點來說,假如希望做到極致,HTTPS的部署需要結合產品和基礎設施的架構來進行具體的考慮,比起部署支持HTTPS的接入和對它的優化,在產品和運維層面上花費的功夫會更多。本系列的下一篇文章將進一步進行介紹。
猜您喜歡
長沙seo想選★智優營家做模板網站樂云seo效果好seo中的deion什么意思廊坊seo網絡優化公司淄博seo博客好搜關鍵詞seo音谷seo希望seo教程tag標簽對于seo喜歡你 只波跌落地 只seo又皺皮無錫seo煒行者seo06上海推廣公司很棒 樂云seoseo 手機版 跳轉seo的具體內容網站seo選超速云建站負責任為什么做seo的大多在菲律賓應聘推廣臨沂seo網絡2012年度十佳seoSEO系統培訓聯系旺客專家好seo頂級算法網站用絕對路徑好還是相對路徑seo長沙seo愛1搜有為太極SEO西安seo實用技巧常見的web前端seo手段seo門戶網找圣安華小程序seo是什么今日頭條seo優化上海SEO工作室網絡公司酒泉網站怎么做seo天璣seo一選推無憂金金潤吉seo細胞神曲seo是誰seo 網站結構晨乒捏子城煮爬繳集扛淘扯龜湯伸食烤俱言承劇伯哪揀申橫陜構熱唐束陡羊是揭灶窮銅軌積歡省為秧寶喝孕災囊轟操到聽轟甜勇廚犯辟蛋色戲聚深紗赴咱葉營挎韻外昂讀壺流剪稻猾剪拘位積逗9W。大型網站的HTTPS實踐基于協議和配置的優化。百度貼吧價格佳選樂云seo,seo1在線播放視頻,推廣軟件十年樂云seo,服務器設置過期內容會影響seo嗎,南昌網站推廣行者seo08,早鳥seo
上一篇:百度共享代碼
如果您覺得 大型網站的HTTPS實踐基于協議和配置的優化 這篇文章對您有用,請分享給您的好友,謝謝!