前端要知道的HTTPS
- 2019 年 12 月 27 日
- 筆記
概述
HTTPS(HTTP Secure)是一種構建在 SSL 或 TLS 上的HTTP協議。 簡單的說,HTTPS 就是 HTTP 的安全版本。SSL(Secure Sockets Layer)以及繼任者 TLS(Transport Layer Security)是一種安全協議,為網路通訊提供來源認證、數據加密和報文完整性檢測,保障通訊的保密性和可靠性。HTTPS協議的 URL 都以 「https://」開頭,在訪問某個 Web 頁面時,客戶端會打開一條到伺服器 443 埠的連接。

HTTP和HTTPS
之所以說HTTP不安全,是由於以下3個原因導致的:
- 數據以明文傳遞,有被竊聽的風險
- 接收到的報文無法證明是發送時的報文,不能保障完整性,因此報文有被篡改的風險
- 不驗證通訊兩端的身份,請求或響應有被偽造的風險

HTTP的風險
當初設計 HTTPS 是為了滿足哪些需求?
很多介紹 HTTPS 的文章一上來就給你講實現細節。個人覺得:這是不好的做法。一上來就給你講協議細節,你充其量只能知道 WHAT 和 HOW,無法理解 WHY。
兼容性
因為是先有 HTTP 再有 HTTPS。所以,HTTPS 的設計者肯定要考慮到對原有 HTTP 的兼容性。這裡所說的兼容性包括很多方面。比如已有的 Web 應用要儘可能無縫地遷移到 HTTPS;比如對瀏覽器廠商而言,改動要儘可能小。
基於「兼容性」方面的考慮,很容易得出如下幾個結論:
- HTTPS 還是要基於 TCP 來傳輸(如果改為 UDP 作傳輸層,無論是 Web 服務端還是瀏覽器客戶端,都要大改,動靜太大了)
- 單獨使用一個新的協議,把 HTTP 協議包裹起來(所謂的「HTTP over SSL」,實際上是在原有的 HTTP 數據外面加了一層 SSL 的封裝。HTTP 協議原有的 GET、POST 之類的機制,基本上原封不動)
打個比方:如果原來的 HTTP 是塑料水管,容易被戳破;那麼如今新設計的 HTTPS 就像是在原有的塑料水管之外,再包一層金屬水管。一來,原有的塑料水管照樣運行;二來,用金屬加固了之後,不容易被戳破。
可擴展性
前面說了,HTTPS 相當於是「HTTP over SSL」。如果 SSL 這個協議在「可擴展性」方面的設計足夠牛逼,那麼它除了能跟 HTTP 搭配,還能夠跟其它的應用層協議搭配。豈不美哉?
現在看來,當初設計 SSL 的人確實比較牛。如今的 SSL/TLS 可以跟很多常用的應用層協議(比如:FTP、SMTP、POP、Telnet)搭配,來強化這些應用層協議的安全性。
接著剛才打的比方:如果把 SSL/TLS 視作一根用來加固的金屬管,它不僅可以用來加固輸水的管道,還可以用來加固輸煤氣的管道。
保密性(防泄密)
HTTPS 需要做到足夠好的保密性。說到保密性,首先要能夠對抗嗅探(行話叫 Sniffer)。所謂的「嗅探」,通俗而言就是監視你的網路傳輸流量。如果你使用明文的 HTTP 上網,那麼監視者通過嗅探,就知道你在訪問哪些網站的哪些頁面。
嗅探是最低級的攻擊手法。除了嗅探,HTTPS 還需要能對抗其它一些稍微高級的攻擊手法——比如「重放攻擊」。
完整性(防篡改)
除了「保密性」,還有一個同樣重要的目標是「確保完整性」。在發明 HTTPS 之前,由於 HTTP 是明文的,不但容易被嗅探,還容易被篡改。比如咱們天朝的網路運營商(ISP)都比較流氓,經常有網友抱怨說訪問某網站(本來是沒有廣告的),竟然會跳出很多中國電信的廣告。為啥會這樣捏?因為你的網路流量需要經過 ISP 的線路才能到達公網。如果你使用的是明文的 HTTP,ISP 很容易就可以在你訪問的頁面中植入廣告。
所以,當初設計 HTTPS 的時候,還有一個需求是「確保 HTTP 協議的內容不被篡改」。
真實性(防假冒)
在談到 HTTPS 的需求時,「真實性」經常被忽略。其實「真實性」的重要程度不亞於前面的「保密性」和「完整性」。你因為使用網銀,需要訪問該網銀的 Web 站點。那麼,你如何確保你訪問的網站確實是你想訪問的網站?(這話有點繞口令)
有些天真的同學會說:通過看網址裡面的域名,來確保。為啥說這樣的同學是「天真的」?因為 DNS 系統本身是不可靠的(尤其是在設計 SSL 的那個年代,連 DNSSEC 都還沒發明)。由於 DNS 的不可靠(存在「域名欺騙」和「域名劫持」),你看到的網址裡面的域名【未必】是真實滴!
所以,HTTPS 協議必須有某種機制來確保「真實性」的需求(至於如何確保,後面會細聊)。
性能
再來說最後一個需求——性能。引入 HTTPS 之後,【不能】導致性能變得太差。否則的話,誰還願意用?為了確保性能,SSL 的設計者至少要考慮如下幾點:
- 如何選擇加密演算法(「對稱」or「非對稱」)?
- 如何兼顧 HTTP 採用的「短連接」TCP 方式?(SSL 是在1995年之前開始設計的,那時候的 HTTP 版本還是 1.0,默認使用的是「短連接」的 TCP 方式——默認不啟用 Keep-Alive)
以上就是設計 SSL 協議時,必須兼顧的各種需求。後面聊協議的實現時,俺會拿 SSL 協議的特點跟前面的需求作對照。看看這些需求是如何一一滿足滴。
HTTPS的組成
加密
在密碼學中,加密是指將明文轉換為難以理解的密文;解密與之相反,是把密文換回明文。加密和解密都是由兩部分組成:演算法和密鑰。
加密演算法可以分為兩類:對稱加密和非對稱加密。
對稱加密
對稱加密在加密和解密的過程中只是用一個密鑰,這個密鑰叫對稱密鑰,也叫共享密鑰,如下圖。

對稱加密
對稱加密的優點就是計算速度快,缺點也很明顯,就是通訊兩端需要分享密鑰。客戶端和伺服器在進行對話前,要先將對稱密鑰發送給對方,在傳輸的過程中密鑰有被竊取的風險,一旦被竊取,那麼密文就能輕鬆翻譯成明文,加密保護形同虛設。
非對稱加密
非對稱加密在加密的過程中使用公開密鑰(public key),在解密的過程中使用私有密鑰(private key)。加密和解密的過程也可以反過來。

非對稱加密
非對稱加密的缺點時計算速度慢,但它很好的解決了對稱加密的問題,避免了資訊泄露。通訊兩端如果都使用非對稱加密,那麼各自都會生成一對密鑰,私鑰留在身邊,公鑰發送給對方,公鑰在傳輸途中即使被人竊取,也不用擔心,因為沒有私鑰就無法輕易解密。在交換公鑰後,就可以用對方的公鑰把數據加密,開始密文對話。
HTTPS採用混合加密機制,將兩種加密演算法組合使用,充分利用各自的優點,博採眾長。在交換公鑰階段採用非對稱加密,在傳輸報文階段使用對稱加密。
數字簽名
數字簽名是一段由發送者生成的特殊加密校驗碼,用於確定報文的完整性,數字簽名的生成涉及兩種技術:非對稱加密和數字摘要。
數字摘要可以將變長的報文提取為定長的摘要,報文內容不同提取的摘要也將不同,常用的摘要演算法有 MD5 和 SHA。簽名和校驗的過程總共分為 5 步,如下如。
- 發送方用摘要演算法對報文進行提取,生成一段摘要
- 然後用私鑰對摘要進行加密,加密後的摘要作為數字簽名附加在報文上,一起發送給接收方
- 接收方收到報文後,用同樣的摘要演算法提取出摘要
- 再用接收到的公鑰對報文中的數字簽名進行解密
- 如果兩個摘要相同,那麼就能證明報文沒有被篡改

數字簽名的校驗過程
數字證書
數字證書相當於網路上的身份證,用於身份識別,由權威的數字認證機構(CAlendar)負責頒發和管理、數字證書的格式普遍遵循 X.509 國際標準,證書的內容包括:
- 有效期
- 頒發機構
- 頒發機構的簽名
- 證書所有者的名稱
- 證書所有者的公開密鑰
- 版本號和唯一序列號
客戶端(如瀏覽器)會預先植入一個受信任的頒發機構列表,如果收到的證書來自陌生的機構,那麼會彈出一個安全警報對話框,如下圖時IE瀏覽器的安全警報。

IE的安全警報
一般數字證書都會被安裝在伺服器處,當客戶端發起安全請求時,伺服器就會返回數字證書。客戶端從受信機構列表中找到相應的公開密鑰,解開數字證書。然後驗證數字證書中的資訊,如果驗證通過,就說明請求來自意料之中的伺服器;如果不通過,就說明證書被冒用,來源可疑,客戶端立刻發出警告。下圖描繪了這個認證過程。

數字證書的認證過程
安全通訊機制
客戶端和伺服器將通過好幾個步驟建立起安全連接,然後開始通訊,下面時精簡過的步驟:
- 客戶端發送 Client Hello 報文開始 SSL 通訊,報文中還包括協議版本號、加密演算法等資訊
- 伺服器發送 Server Hello 報文作為應答,在報文中也會包括協議版本號、加密演算法等資訊
- 伺服器發送數字證書,數字證書中包括伺服器中的公開密鑰
- 客戶端解開並驗證數字證書,驗證通過後,生成一個隨機密碼串(premaster secure),再用收到的伺服器公鑰進行解密,發送給伺服器
- 客戶端再次發送 Change Cipher 報文,提示伺服器在此條報文之後,採用剛剛生成的隨機密碼串進行數據加密
- 伺服器也發送 Change Cipher Spec 報文
- SSL 連接建立完成,接下來就可以開始傳輸數據了
下圖描繪了這些步驟

HTTPS通訊
常見筆試面試題
HTTPS有哪些缺點?
HTTPS有如下4個缺點
- 通訊兩端都需要進行加密和解密,會消耗大量的CPU、記憶體等資源,增加了伺服器的負載
- 加密運算和多次握手降低了訪問速度
- 在開發階段,加大了頁面調試難度。由於資訊都被加密了,所以用代理工具的話,需要先解密然後才能看到真實資訊。
- 用 HTTPS 訪問的頁面,頁面內的外部資源都得用HTTPS請求,包括腳本中的AJAX請求
什麼是運營商劫持?有什麼辦法預防?
運營商是指提供網路服務的ISP(Internet Service Provider),例如三大基礎運營商:中國電信、中國移動和中國聯通。
運營商為了牟取經濟利益,有時候會劫持用戶的HTTP訪問最明顯的特徵就是在頁面上植入廣告,有些是購物廣告,有些卻是淫穢廣告,非常影響介面體驗和公司形象。為了避免被劫持,可以讓伺服器支援 HTTPS HTTPS 協議,HTTPS傳輸的數據都被加密過了,運營商就無法再注入廣告程式碼,這樣頁面就不會再被劫持。
相關推薦:
本文摘抄自《前端程式設計師面試筆試寶典》,媛媛之家/組編 平文 等/編著,機械工業出版社,版權歸原作者所有
本文代表個人觀點,內容僅供參考。若有不恰當之處,望不吝賜教!
本文鏈接:https://zhangbing.site/2019/08/03/前端要知道的HTTPS/。