前端要知道的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個原因導致的:

  1. 數據以明文傳遞,有被竊聽的風險
  2. 接收到的報文無法證明是發送時的報文,不能保障完整性,因此報文有被篡改的風險
  3. 不驗證通訊兩端的身份,請求或響應有被偽造的風險

HTTP的風險

當初設計 HTTPS 是為了滿足哪些需求?

很多介紹 HTTPS 的文章一上來就給你講實現細節。個人覺得:這是不好的做法。一上來就給你講協議細節,你充其量只能知道 WHAT 和 HOW,無法理解 WHY。

兼容性

因為是先有 HTTP 再有 HTTPS。所以,HTTPS 的設計者肯定要考慮到對原有 HTTP 的兼容性。這裡所說的兼容性包括很多方面。比如已有的 Web 應用要儘可能無縫地遷移到 HTTPS;比如對瀏覽器廠商而言,改動要儘可能小。

基於「兼容性」方面的考慮,很容易得出如下幾個結論:

  1. HTTPS 還是要基於 TCP 來傳輸(如果改為 UDP 作傳輸層,無論是 Web 服務端還是瀏覽器客戶端,都要大改,動靜太大了)
  2. 單獨使用一個新的協議,把 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 的設計者至少要考慮如下幾點:

  1. 如何選擇加密演算法(「對稱」or「非對稱」)?
  2. 如何兼顧 HTTP 採用的「短連接」TCP 方式?(SSL 是在1995年之前開始設計的,那時候的 HTTP 版本還是 1.0,默認使用的是「短連接」的 TCP 方式——默認不啟用 Keep-Alive)

以上就是設計 SSL 協議時,必須兼顧的各種需求。後面聊協議的實現時,俺會拿 SSL 協議的特點跟前面的需求作對照。看看這些需求是如何一一滿足滴。

HTTPS的組成

加密

在密碼學中,加密是指將明文轉換為難以理解的密文;解密與之相反,是把密文換回明文。加密和解密都是由兩部分組成:演算法和密鑰。

加密演算法可以分為兩類:對稱加密和非對稱加密。

對稱加密

對稱加密在加密和解密的過程中只是用一個密鑰,這個密鑰叫對稱密鑰,也叫共享密鑰,如下圖。

對稱加密

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

非對稱加密

非對稱加密在加密的過程中使用公開密鑰(public key),在解密的過程中使用私有密鑰(private key)。加密和解密的過程也可以反過來。

非對稱加密

非對稱加密的缺點時計算速度慢,但它很好的解決了對稱加密的問題,避免了資訊泄露。通訊兩端如果都使用非對稱加密,那麼各自都會生成一對密鑰,私鑰留在身邊,公鑰發送給對方,公鑰在傳輸途中即使被人竊取,也不用擔心,因為沒有私鑰就無法輕易解密。在交換公鑰後,就可以用對方的公鑰把數據加密,開始密文對話。

HTTPS採用混合加密機制,將兩種加密演算法組合使用,充分利用各自的優點,博採眾長。在交換公鑰階段採用非對稱加密,在傳輸報文階段使用對稱加密。

數字簽名

數字簽名是一段由發送者生成的特殊加密校驗碼,用於確定報文的完整性,數字簽名的生成涉及兩種技術:非對稱加密和數字摘要。

數字摘要可以將變長的報文提取為定長的摘要,報文內容不同提取的摘要也將不同,常用的摘要演算法有 MD5 和 SHA。簽名和校驗的過程總共分為 5 步,如下如。

  1. 發送方用摘要演算法對報文進行提取,生成一段摘要
  2. 然後用私鑰對摘要進行加密,加密後的摘要作為數字簽名附加在報文上,一起發送給接收方
  3. 接收方收到報文後,用同樣的摘要演算法提取出摘要
  4. 再用接收到的公鑰對報文中的數字簽名進行解密
  5. 如果兩個摘要相同,那麼就能證明報文沒有被篡改

數字簽名的校驗過程

數字證書

數字證書相當於網路上的身份證,用於身份識別,由權威的數字認證機構(CAlendar)負責頒發和管理、數字證書的格式普遍遵循 X.509 國際標準,證書的內容包括:

  1. 有效期
  2. 頒發機構
  3. 頒發機構的簽名
  4. 證書所有者的名稱
  5. 證書所有者的公開密鑰
  6. 版本號和唯一序列號

客戶端(如瀏覽器)會預先植入一個受信任的頒發機構列表,如果收到的證書來自陌生的機構,那麼會彈出一個安全警報對話框,如下圖時IE瀏覽器的安全警報。

IE的安全警報

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

數字證書的認證過程

安全通訊機制

客戶端和伺服器將通過好幾個步驟建立起安全連接,然後開始通訊,下面時精簡過的步驟:

  1. 客戶端發送 Client Hello 報文開始 SSL 通訊,報文中還包括協議版本號、加密演算法等資訊
  2. 伺服器發送 Server Hello 報文作為應答,在報文中也會包括協議版本號、加密演算法等資訊
  3. 伺服器發送數字證書,數字證書中包括伺服器中的公開密鑰
  4. 客戶端解開並驗證數字證書,驗證通過後,生成一個隨機密碼串(premaster secure),再用收到的伺服器公鑰進行解密,發送給伺服器
  5. 客戶端再次發送 Change Cipher 報文,提示伺服器在此條報文之後,採用剛剛生成的隨機密碼串進行數據加密
  6. 伺服器也發送 Change Cipher Spec 報文
  7. SSL 連接建立完成,接下來就可以開始傳輸數據了

下圖描繪了這些步驟

HTTPS通訊

常見筆試面試題

HTTPS有哪些缺點?

HTTPS有如下4個缺點

  1. 通訊兩端都需要進行加密和解密,會消耗大量的CPU、記憶體等資源,增加了伺服器的負載
  2. 加密運算和多次握手降低了訪問速度
  3. 在開發階段,加大了頁面調試難度。由於資訊都被加密了,所以用代理工具的話,需要先解密然後才能看到真實資訊。
  4. 用 HTTPS 訪問的頁面,頁面內的外部資源都得用HTTPS請求,包括腳本中的AJAX請求

什麼是運營商劫持?有什麼辦法預防?

運營商是指提供網路服務的ISP(Internet Service Provider),例如三大基礎運營商:中國電信、中國移動和中國聯通。

運營商為了牟取經濟利益,有時候會劫持用戶的HTTP訪問最明顯的特徵就是在頁面上植入廣告,有些是購物廣告,有些卻是淫穢廣告,非常影響介面體驗和公司形象。為了避免被劫持,可以讓伺服器支援 HTTPS HTTPS 協議,HTTPS傳輸的數據都被加密過了,運營商就無法再注入廣告程式碼,這樣頁面就不會再被劫持。


相關推薦:


本文摘抄自《前端程式設計師面試筆試寶典》,媛媛之家/組編 平文 等/編著,機械工業出版社,版權歸原作者所有

本文代表個人觀點,內容僅供參考。若有不恰當之處,望不吝賜教!

本文鏈接:https://zhangbing.site/2019/08/03/前端要知道的HTTPS/