? ? ??? ? ? ?
面試常見問題,HTTPS優化總結易記版:
1、HSTS重定向技術:將http自動轉換為https,減少301重定向
2、TLS握手優化:在TLS握手完成前客戶端就提前向服務器發送數據
3、會話標識符:服務器記錄下與某客戶端的會話ID,下次連接客戶端發ID過來就可以直接用之前的私鑰交流了
4、OSCP Stapling:服務器將帶有 CA 機構簽名的 OCSP 響應在握手時發給客戶端,省的客戶端再去CA查詢
5、完全前向加密PFS:使用更牛逼復雜的秘鑰算法
?
HTTP與HTTPS介紹
?? ??? ?超文本傳輸協議HTTP協議被用于在Web瀏覽器和網站服務之間傳遞信息,HTTP協議以明文方式發送內容,不提供任何方式的數據加密,如果攻擊者截取了Web瀏覽器和網站服務器之間的傳輸報文,就可以直接讀懂其中的信息,因此,HTTP協議不適合傳輸一些敏感信息,比如:信用卡號、密碼等支付信息。
?? ??? ?
?? ??? ?
?? ??? ?為了解決HTTP協議的這一缺陷,需要使用另一種協議:安全套接字層超文本傳輸協議HTTPS,為了數據傳輸的安全,HTTPS在HTTP的基礎上加入了SSL/TLS依靠證書來驗證服務器的身份,并為瀏覽器和服務器之間的通信加密。
? ? ? ? 套接字:
????????套接字是一種通信機制,它有三個屬性確定,它們是域(domain),類型(type),和協議(protocol)。域指定套接字通信中使用的網絡介質,最常見的是AF_INET(IPv4)或者AF_INET6(IPv6),它們用于Internet網絡。類型包括流套接字(SOCK_STREAM)、數據報套接字(SOCK_DGRAM)和原始套接字(SOCK_RAW)。流套接字用于提供面向連接、可靠的數據傳輸服務,數據報套接字提供無連接的服務,而原始套接字可以讀寫內核沒有處理的IP數據包。? ? ? ??
????????
? ? ? ? HTTPS協議是由SSL/TLS+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,要比HTTP協議安全
? ? ? ? HTTPS協議的主要作用可以分為兩種:一種是建立一個信息安全通道,來保證數據傳輸的安全;另一種就是確認網站的真實性。
HTTPS和HTTP的主要區別
- https協議需要到CA申請證書,一般免費證書比較少,因而需要一定費用。
- http是超文本傳輸協議,信息是明文傳輸,https則是具有安全性的ssl/tls加密傳輸協議。
- http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
- http的連接很簡單,是無狀態的;https協議是有SSL/TLS+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。
HTTP無狀態?
HTTP是無狀態:是指http的每一次請求都是一次單獨的請求,是指協議對于事務處理沒有記憶能力。瀏覽器第一次向服務器發送請求,服務器給出響應;同一個瀏覽器第二次向服務器發送請求,瀏覽器同樣給出響應,但是因為HTTP協議無狀態,沒有記憶能力,所以服務器不知道這個瀏覽器上次來過,第二次給出響應和第一次給出響應相同,每次都需要重傳信息,導致傳送的數據量增大。
http無狀態的優點
不需要額外的資源來記錄狀態信息,不僅實現上會簡單一些,而且還能減輕服務器的負擔。
對于有狀態協議來說,如果將會話狀態與連接綁定在一起,那么如果連接意外斷開,整個會話就會丟失,重新連接之后一般需要從頭開始
http無狀態的缺點
因為每個請求都是獨立的,所以單個請求需要的所有信息都必須要包含在請求中一次發送到服務端,這導致單個消息的結構需要比較復雜,必須能夠支持大量元數據
HTTPS的主干層次介紹
這部分內容作為前提點綴,如果你是初次了解HTTPS,看不懂這里不要緊,只要把文章后面看完,再回過頭來看這里的內容,就能恍然大悟了。
第一層:HTTPS本質上是為了實現加密通信,理論上,加密通信就是雙方都持有一個對稱加密的秘鑰,然后就可以安全通信了
? ? 但是,無論這個最初的秘鑰是由客戶端傳給服務端,還是服務端傳給客戶端,都是明文傳輸,中間人都可以知道。那就讓這個過程變成密文就好了唄,而且還得是中間人解不開的密文。
第二層:使用非對稱加密 加密客戶端與服務端協商生成對稱秘鑰之前各種鹽值、種子。
? ? 但是,在使用非對稱加密秘鑰之前,比如由服務端生成非對稱秘鑰,它需要將生成的公鑰給到客戶端,這個時候公鑰就會在網絡中明文傳輸,任何人都可以更改,會有中間人攻擊的問題。因此,只能引入公信機構CA,使我們傳輸自己的公鑰時可以保證不會被篡改!
第三層:服務端把自己的公鑰給 CA,讓 CA 用 CA 的私鑰加密,然后返回加密結果(可以用CA的公鑰解密,如果要篡改結果,必須再次用 CA 的私鑰加密,由于中間人沒法獲取私鑰,所以無法篡改)。
對稱加密與非對稱加密
對稱加密:?
就是通過同一個“密鑰”,將明文加密成密文,并且也能把密文解密成明文。引用對稱加密之后,即使數據被截獲,由于黑客不知道密鑰是什么,因此就無法解密,不知道請求的內容。
非對稱加密:
非對稱加密要用到兩個密鑰,一個叫做“公鑰”(pub),一個叫做“私鑰”(pri)。
公鑰和私鑰是配對的,沒有規定哪個用來加密,哪個用來解密。最大的缺點就是運算速度非常慢,比對稱加密慢得多。
通過公鑰對明文加密,變成密文
通過私鑰對密文解密,變成明文
也可以反過來:通過私鑰對明文加密,變成密文
通過公鑰對密文解密,變成明文
通常是公鑰加密,私鑰解密。
客戶端在使用HTTPS方式與Web服務器通信時的步驟
???????????(1)客戶使用https的URL訪問Web服務器,要求與Web服務器建立SSL連接。
????????(2)Web服務器收到客戶端請求后,會將網站的證書信息(證書中包含公鑰)傳送一份給客戶端。
????????(3)客戶端的瀏覽器與Web服務器開始協商SSL/TLS連接的安全等級,也就是信息加密的等級。
????????(4)客戶端的瀏覽器根據雙方同意的安全等級,建立會話密鑰,然后利用網站的公鑰將會話密鑰加密,并傳送給網站。
????????(5)Web服務器利用自己的私鑰解密出會話密鑰。
????????(6)Web服務器利用會話密鑰加密與客戶端之間的通信。
?
?盡管HTTPS并非絕對安全,掌握根證書的機構、掌握加密算法的組織同樣可以進行中間人形式的攻擊,但HTTPS仍是現行架構下最安全的解決方案,他大幅增加了中間人攻擊的成本
SSL與TLS
SSL:(Secure Socket Layer,安全套接字層),位于可靠的面向連接的網絡層協議和應用層協議之間的一種協議層。SSL通過互相認證、使用數字簽名確保完整性、使用加密確保私密性,以實現客戶端和服務器之間的安全通訊。該協議由兩層組成:SSL記錄協議和SSL握手協議。
TLS:(Transport Layer Security,傳輸層安全協議),用于兩個應用程序之間提供保密性和數據完整性。該協議由兩層組成:TLS記錄協議和TLS握手協議。TLS是HTTP與TCP協議之間的一層,通常TLS發生在TCP三次握手之后,此時進行TLS四次握手,然后再進行HTTP通信
?
HTTPS的缺點
雖然說HTTPS有很大的優勢,但其相對來說,還是存在不足之處的:
(1)HTTPS協議握手階段比較費時,會使頁面的加載時間延長近50%,增加10%到20%的耗電;
(2)HTTPS連接緩存不如HTTP高效,會增加數據開銷和功耗,甚至已有的安全措施也會因此而受到影響;
(3)SSL證書需要錢,功能越強大的證書費用越高,個人網站、小網站沒有必要一般不會用。
(4)SSL證書通常需要綁定IP,不能在同一IP上綁定多個域名,IPv4資源不可能支撐這個消耗。
(5)HTTPS協議的加密范圍也比較有限,在黑客攻擊、拒絕服務攻擊、服務器劫持等方面幾乎起不到什么作用。最關鍵的,SSL證書的信用鏈體系并不安全,特別是在某些國家可以控制CA根證書的情況下,中間人攻擊一樣可行。
實踐中建議保留http。所以我們在切換的時候可以做http和https的兼容,具體實現方式是,去掉頁面鏈接中的http頭部,這樣可以自動匹配http頭和https頭。例如:將http://www.baidu.com改為//www.baidu.com。然后當用戶從http的入口進入訪問頁面時,頁面就是http,如果用戶是從https的入口進入訪問頁面,頁面即使https的
?
如何優化HTTPS的速度
HTTPS連接大致可以劃分為兩個部分:第一個是建立連接時的非對稱加密握手,第二個是握手后的對稱加密報文傳輸。
由于目前流行的 AES、ChaCha20 性能都很好,還有硬件優化,報文傳輸的性能損耗可以說是非常地小,小到幾乎可以忽略不計了。所以,通常所說的“HTTPS 連接慢”指的就是剛開始建立連接的那段時間。
在 TCP 建連之后,正式數據傳輸之前,HTTPS 比 HTTP 增加了一個 TLS 握手的步驟,這個步驟最長可以花費兩個消息往返,也就是 2-RTT(TLS1.3只需1-RTT)。而且在握手消息的網絡耗時之外,還會有其他的一些“隱形”消耗,比如:
? ? ? ?產生用于密鑰交換的臨時公私鑰對(ECDHE);
? ? ? ?驗證證書時訪問 CA 獲取 CRL 或者 OCSP;
? ? ? ?非對稱加密解密處理“Pre-Master”。
1、HSTS重定向技術
HSTS(HTTP Strict Transport Security,HTTP 嚴格傳輸安全)技術,啟用HSTS后,將保證瀏覽器始終連接到網站的 HTTPS 加密版本。這相當于告訴瀏覽器:我這個網站必須嚴格使用 HTTPS 協議,在半年之內(182.5 天)都不允許用 HTTP,你以后就自己做轉換吧,不要再來麻煩我了。
? ? ? ? 1. 用戶在瀏覽器里輸入 HTTP 協議進行訪問時,瀏覽器會自動將 HTTP 轉換為 HTTPS 進行訪問,確保用戶訪問安全;
? ? ? ? 2. 省去301跳轉的出現,縮短訪問時間;
? ? ? ? 3. 能阻止基于 SSL Strip 的中間人攻擊,萬一證書有錯誤,則顯示錯誤,用戶不能回避警告,從而能夠更加有效安全的保障用戶的訪問。
2、TLS握手優化
? ? ? ? 在傳輸應用數據之前,客戶端必須與服務端協商密鑰、加密算法等信息,服務端還要把自己的證書發給客戶端表明其身份,這些環節構成 TLS 握手過程。
? ? ? ? 使用 ECDHE 橢圓曲線密碼套件,可以節約帶寬和計算量,還能實現“False Start”,采用 False Start (搶先開始)技術,瀏覽器在與服務器完成 TLS 握手前,就開始發送請求數據,服務器在收到這些數據后,完成 TLS 握手的同時,開始發送響應數據。
? ? ? ? 開啟 False Start 功能后,數據傳輸時間將進一步縮短。
3、Session Identifier(會話標識符)復用
? ? ? ? 如果用戶的一個業務請求包含了多條的加密流,客戶端與服務器將會反復握手,必定會導致更多的時間損耗。或者某些特殊情況導致了對話突然中斷,雙方就需要重新握手,增加了用戶訪問時間。
? ? ? ? (1)服務器為每一次的會話都生成并記錄一個 ID 號,然后發送給客戶端;
? ? ? ? (2)如果客戶端發起重新連接,則只要向服務器發送該 ID 號;
? ? ? ? (3)服務器收到客戶端發來的 ID 號,然后查找自己的會話記錄,匹配 ID 之后,雙方就可以重新使用之前的對稱加密秘鑰進行數據加密傳輸,而不必重新生成,減少交互時間(只用一個消息往返就可以建立安全連接)。
? ? ? ? 但它也有缺點,服務器必須保存每一個客戶端的會話數據,對于擁有百萬、千萬級別用戶的網站來說存儲量就成了大問題,加重了服務器的負擔。于是又出現了第二種“Session Ticket”的方案。
? ? ? ? 它有點類似 HTTP 的 Cookie,存儲的責任由服務器轉移到了客戶端,服務器加密會話信息,用“New Session Ticket”消息發給客戶端,讓客戶端保存。重連的時候,客戶端使用擴展“session_ticket”發送“Ticket”而不是“Session ID”,服務器解密后驗證有效期,就可以恢復會話,開始加密通信。不過“Session Ticket”方案需要使用一個固定的密鑰文件(ticket_key)來加密 Ticket,為了防止密鑰被破解,保證“前向安全”,密鑰文件需要定期輪換,比如設置為一小時或者一天。
4、開啟OSCP Stapling(OSCP裝訂),提高TLS握手效率
? ? ? ? 客戶端的證書驗證其實是個很復雜的操作,除了要公鑰解密驗證多個證書簽名外,因為證書還有可能會被撤銷失效,客戶端有時還會再去訪問 CA,下載 CRL (Certificate revocation list,證書吊銷列表,用于確認證書是否有效,體積較大,現基本不用)或者 OCSP 數據,這又會產生 DNS 查詢、建立連接、收發數據等一系列網絡通信,增加好幾個 RTT。
? ? ? ? 采用OCSP Stapling ,提升 HTTPS 性能。服務端主動獲取 OCSP 查詢結果并隨著證書一起發送給客戶端,從而客戶端可直接通過 Web Server 驗證證書,提高 TLS 握手效率。
? ? ? ? 服務器模擬瀏覽器向 CA 發起請求,并將帶有 CA 機構簽名的 OCSP 響應保存到本地,然后在與客戶端握手階段,將 OCSP 響應下發給瀏覽器,省去瀏覽器的在線驗證過程。由于瀏覽器不需要直接向 CA 站點查詢證書狀態,這個功能對訪問速度的提升非常明顯。
5、完全前向加密PFS,保護用戶數據,預防私鑰泄漏
? ? ? ? 非對稱加密算法 RSA,包含了公鑰、私鑰,其中私鑰是保密不對外公開的,由于此算法既可以用于加密也可以用于簽名,所以用途甚廣,但是還是會遇到一些問題:
(1) 假如我是一名黑客,雖然現在我不知道私鑰,但是我可以先把客戶端與服務器之前的傳輸數據(已加密)全部保存下來
(2)如果某一天,服務器維護人員不小心把私鑰泄露了,或者服務器被我攻破獲取到了私鑰
(3)那我就可以利用這個私鑰,破解掉之前已被我保存的數據,從中獲取有用的信息,即所謂的“今日截獲,明日破解”。
? ? ? ? 所以為了防止上述現象發生,我們必須保護好自己的私鑰。
? ? ? ? 如果私鑰確實被泄漏了,那我們改如何補救呢?那就需要PFS(perfect forward secrecy)完全前向保密功能,此功能用于客戶端與服務器交換對稱密鑰,起到前向保密的作用,也即就算私鑰被泄漏,黑客也無法破解先前已加密的數據。維基解釋是:長期使用的主密鑰泄漏不會導致過去的會話密鑰泄漏
? ? ? ? 實現此功能需要服務器支持以下算法和簽名組合:
? ? ? ? (1)ECDHE 密鑰交換、RSA 簽名;
? ? ? ? (2)ECDHE 密鑰交換、ECDSA 簽名;
? ? ? ? ECDHE 算法在每次握手時都會生成一對臨時的公鑰和私鑰,每次通信的密鑰對都是不同的,也就是“一次一密”,即使黑客花大力氣破解了這一次的會話密鑰,也只是這次通信被攻擊,之前的歷史消息不會受到影響,仍然是安全的。
? ? ? ?使用ECDHE算法的TLS交換過程具有如下優點:運算速度快,安全性高,還支持“False Start”,能夠把握手的消息往返由 2-RTT 減少到 1-RTT
? ? ? ?所以現在主流的服務器和瀏覽器在握手階段都已經不再使用 RSA,改用 ECDHE,而 TLS1.3 在協議里明確廢除 RSA 和 DH 則在標準層面保證了“前向安全”。
更多詳細信息:https://blog.csdn.net/qq_35642036/article/details/82788421