標籤:
1 HTTPS 協議概述
HTTPS 可以認為是 HTTP + TLS。HTTP 協議大家耳熟能詳了,目前大部分 WEB 應用和網站都是使用 HTTP 協議傳輸的。
TLS 是傳輸層加密協議,它的前身是 SSL 協議,最早由 netscape 公司於 1995 年發布,1999 年經過 IETF 討論和規範後,改名為 TLS。如果沒有特別說明,SSL 和 TLS 說的都是同一個協議。
HTTP 和 TLS 在協議層的位置以及 TLS 協議的組成如:
圖 1 TLS 協議格式
TLS 協議主要有五部分:應用資料層協議,握手協議,警示協議,加密訊息確認協議,心跳協議。
TLS 協議本身又是由 record 協議傳輸的,record 協議的格式如最右所示。
目前常用的 HTTP 協議是 HTTP1.1,常用的 TLS 協議版本有如下幾個:TLS1.2, TLS1.1, TLS1.0 和 SSL3.0。其中 SSL3.0 由於 POODLE 攻擊已經被證明不安全,但統計發現依然有不到 1% 的瀏覽器使用 SSL3.0。TLS1.0 也存在部分安全性漏洞,比如 RC4 和 BEAST 攻擊。
TLS1.2 和 TLS1.1 暫時沒有已知的安全性漏洞,比較安全,同時有大量擴充提升速度和效能,推薦大家使用。
需要關注一點的就是 TLS1.3 將會是 TLS 協議一個非常重大的改革。不管是安全性還是使用者訪問速度都會有質的提升。不過目前沒有明確的發布時間。
同時 HTTP2 也已經正式定稿,這個由 SPDY 協議演化而來的協議相比 HTTP1.1 又是一個非常重大的變動,能夠明顯提升應用程式層資料的傳輸效率。
2 HTTPS 功能介紹
百度使用 HTTPS 協議主要是為了保護使用者隱私,防止流量劫持。
HTTP 本身是明文傳輸的,沒有經過任何安全處理。例如使用者在百度搜尋了一個關鍵字,比如“蘋果手機”,中間者完全能夠查看到這個資訊,並且有可能打電話過來騷擾使用者。也有一些使用者投訴使用百度時,發現首頁或者結果頁面浮了一個很長很大的廣告,這也肯定是中間者往頁面插的廣告內容。如果劫持技術比較低劣的話,使用者甚至無法訪問百度。
這裡提到的中間者主要指一些網路節點,是使用者資料在瀏覽器和百度伺服器中間傳輸必須要經過的節點。比如 WIFI 熱點,路由器,防火牆,反向 Proxy,快取服務器等。
在 HTTP 協議下,中間者可以隨意嗅探使用者搜尋內容,竊取隱私甚至篡改網頁。不過 HTTPS 是這些劫持行為的剋星,能夠完全有效地防禦。
總體來說,HTTPS 協議提供了三個強大的功能來對抗上述的劫持行為:
1, 內容加密。瀏覽器到百度伺服器的內容都是以加密形式傳輸,中間者無法直接查看原始內容。
2, 身份認證。保證使用者訪問的是百度服務,即使被 DNS 劫持到了第三方網站,也會提醒使用者沒有訪問百度服務,有可能被劫持
3, 資料完整性。防止內容被第三方冒充或者篡改。
那 HTTPS 是如何做到上述三點的呢?下面從原理角度介紹一下。
3 HTTPS 原理介紹 3.1 內容加密
密碼編譯演算法一般分為兩種,對稱式加密和非對稱式加密。所謂對稱式加密(也叫祕密金鑰加密)就是指加密和解密使用的是相同的密鑰。而非對稱式加密(也叫公開金鑰加密)就是指加密和解密使用了不同的密鑰。
圖 2 對稱式加密
圖 3 非對稱式加密
對稱內容加密強度非常高,一般破解不了。但存在一個很大的問題就是無法安全地產生和保管密鑰。假如用戶端軟體和伺服器之間每次會話都使用固定的,相同的祕密金鑰加密和解密,肯定存在很大的安全隱患。如果有人從用戶端端擷取到了對稱金鑰,整個內容就不存在安全性了,而且管理海量的用戶端密鑰也是一件很複雜的事情。
非對稱式加密主要用於金鑰交換(也叫密鑰協商),能夠很好地解決這個問題。瀏覽器和伺服器每次建立會話時都使用非對稱金鑰交換演算法協商出對稱金鑰,使用這些對稱金鑰完成應用資料的加解密和驗證,整個會話過程中的密鑰只在記憶體中產生和儲存,而且每個會話的對稱金鑰都不相同(除非會話複用),中間者無法竊取。
非對稱金鑰交換很安全,但同時也是 HTTPS 效能和速度嚴重降低的“罪魁禍首”。想要知道 HTTPS 為什麼影響速度,為什麼消耗資源,就一定要理解非對稱金鑰交換的整個過程。
下面重點介紹一下非對稱金鑰交換的數學原理及在 TLS 握手過程中的應用。
3.1.1 非對稱金鑰交換
在非對稱金鑰交換演算法出現以前,對稱式加密一個很大的問題就是不知道如何安全產生和保管密鑰。非對稱金鑰交換過程主要就是為瞭解決這個問題,使得對稱金鑰的產生和使用更加安全。
金鑰交換演算法本身非常複雜,金鑰交換過程涉及到隨機數產生,模指數運算,空白補齊,加密,簽名等操作。
常見的金鑰交換演算法有 RSA,ECDHE,DH,DHE 等演算法。它們的特性如下:
- RSA:演算法實現簡單,誕生於 1977 年,曆史悠久,經過了長時間的破解測試,安全性高。缺點就是需要比較大的素數(目前常用的是 2048 位)來保證安全強度,很消耗 CPU 運算資源。RSA 是目前唯一一個既能用於金鑰交換又能用於認證簽名的演算法。
- DH:diffie-hellman 金鑰交換演算法,誕生時間比較早(1977 年),但是 1999 年才公開。缺點是比較消耗 CPU 效能。
- ECDHE:使用橢圓曲線(ECC)的 DH 演算法,優點是能用較小的素數(256 位)實現 RSA 相同的安全等級。缺點是演算法實現複雜,用於金鑰交換的曆史不長,沒有經過長時間的安全攻擊測試。
- ECDH:不支援 PFS,安全性低,同時無法實現 false start。
- DHE:不支援 ECC。非常消耗 CPU 資源。
建議優先支援 RSA 和 ECDH_RSA 金鑰交換演算法。原因是:
1, ECDHE 支援 ECC 加速,計算速度更快。支援 PFS,更加安全。支援 false start,使用者訪問速度更快。
2, 目前還有至少 20% 以上的用戶端不支援 ECDHE,我們推薦使用 RSA 而不是 DH 或者 DHE,因為 DH 系列演算法非常消耗 CPU(相當於要做兩次 RSA 計算)。
需要注意通常所說的 ECDHE 金鑰交換預設都是指 ECDHE_RSA,使用 ECDHE 產生 DH 演算法所需的公私密金鑰,然後使用 RSA 演算法進行簽名最後再計算得出對稱金鑰。
非對稱式加密相比對稱式加密更加安全,但也存在兩個明顯缺點:
1, CPU 計算資源消耗非常大。一次完全 TLS 握手,金鑰交換時的非對稱解密計算量占整個握手過程的 90% 以上。而對稱式加密的計算量只相當於非對稱式加密的 0.1%,如果應用程式層資料也使用非對稱加解密,效能開銷太大,無法承受。
2, 非對稱式加密演算法對加密內容的長度有限制,不能超過公開金鑰長度。比如現在常用的公開金鑰長度是 2048 位,意味著待加密內容不能超過 256 個位元組。
所以公開金鑰加密目前只能用來作金鑰交換或者內容簽名,不適合用來做應用程式層傳輸內容的加解密。
非對稱金鑰交換演算法是整個 HTTPS 得以安全的基石,充分理解非對稱金鑰交換演算法是理解 HTTPS 協議和功能的關鍵。
下面分別通俗地介紹一下 RSA 和 ECDHE 在金鑰交換過程中的應用。
3.1.1.1 RSA 密鑰協商 3.1.1.1.1 RSA 演算法介紹
RSA 演算法的安全性是建立在乘法無法復原或者大數因子很難分解的基礎上。RSA 的推導和實現涉及到了歐拉函數和費馬定理及模反元素的概念,有興趣的讀者可以自行百度。
RSA 演算法是統治世界的最重要演算法之一,而且從目前來看,RSA 也是 HTTPS 體系中最重要的演算法,沒有之一。
RSA 的計算步驟如下:
1, 隨機挑選兩個質數 p, q,假設 p = 13, q = 19。 n = p * q = 13 * 19 = 247;
2, ?(n) 表示與整數 n 互質數的個數。如果 n 等於兩個質數的積,則?(n)=(p-1)(q-1) 挑選一個數 e,滿足 1< e <?(n) 並且 e 與互質,假設 e = 17;
3, 計算 e 關於 n 的模反元素, ed=1 mod ?(n) , 由 e = 17 ,?(n) =216 可得 d = 89;
4, 求出了 e,和 d,假設明文 m = 135,密文用 c 表示。那麼加解密計算如下:
實際應用中,(n,e) 組成了公開金鑰對,(n,d)組成了私密金鑰對,其中 n 和 d 都是一個接近 22048的大數。即使現在效能很強的 CPU,想要計算 m≡c^d mod(n),也需要消耗比較大的計算資源和時間。
公開金鑰對 (n, e) 一般都註冊到了認證裡,任何人都能直接查看,比如百度認證的公開金鑰對如,其中最末 6 個數字(010001)換算成 10 進位就是 65537,也就是公開金鑰對中的 e。e 取值比較小的好處有兩個:
1, 由 c=m^e mod(n) 可知,e 較小,用戶端 CPU 計算消耗的資源較少。
2, 加大 server 端的破解難度。e 比較小,私密金鑰對中的 d 必然會非常大。所以 d 的取值空間也就非常大,增加了破解難度。
那為什麼 (n,e) 能做為公開金鑰公開,甚至大家都能直接從認證中查看到,這樣安全嗎?分析如下:
由於 ed≡1 mod ?(n),知道了 e 和 n,想要求出私密金鑰 d,就必須知道?(n)。而?(n)=(p-1)*(q-1),必須計算出 p 和 q 才能確定私密金鑰 d。但是當 n 大到一定程度時(比如接近 2^2048),即使現在最快的 CPU 也無法進行這個因式分解,即無法知道 n 是由哪個數 p 和 q 乘出來的。所以就算知道了公開金鑰,整個加解密過程還是非常安全的。
圖 5 百度 HTTPS 認證公開金鑰
3.1.1.1.2 握手過程中的 RSA 密鑰協商
介紹完了 RSA 的原理,那最終會話所需要的對稱金鑰是如何產生的呢?跟 RSA 有什麼關係?
以 TLS1.2 為例簡單描述一下,省略跟金鑰交換無關的握手訊息。過程如下:
1, 瀏覽器發送 client_hello,包含一個隨機數 random1。
2, 服務端回複 server_hello,包含一個隨機數 random2,同時回複 certificate,攜帶了認證公開金鑰 P。
3, 瀏覽器接收到 random2 之後就能夠產生 premaster_secrect 以及 master_secrect。其中 premaster_secret 長度為 48 個位元組,前 2 個位元組是協議版本號碼,剩下的 46 個位元組填充一個隨機數。結構如下:
Struct {byte Version[2];bute random[46];}
master secrect 的產生演算法簡述如下:
Master_key = PRF(premaster_secret, “master secrect”, 隨機數1+隨機數2)其中 PRF 是一個隨機函數,定義如下:PRF(secret, label, seed) = P_MD5(S1, label + seed) XOR P_SHA-1(S2, label + seed)
從上式可以看出,把 premaster_key 賦值給 secret,”master key”賦值給 label,瀏覽器和伺服器端的兩個隨機數做種子就能確定地求出一個 48 位長的隨機數。
而 master secrect 包含了六部分內容,分別是用於校正內容一致性的密鑰,用於對稱內容加解密的密鑰,以及初始化向量(用於 CBC 模式),用戶端和服務端各一份。
至此,瀏覽器側的密鑰已經完成協商。
4, 瀏覽器使用認證公開金鑰 P 將 premaster_secrect 加密後發送給伺服器。
5, 服務端使用私密金鑰解密得到 premaster_secrect。又由於服務端之前就收到了隨機數 1,所以服務端根據相同的產生演算法,在相同的輸入參數下,求出了相同的 master secrect。
RSA 密鑰協商握手過程圖示如下:
圖 6 RSA 密鑰協商過程
可以看出,密鑰協商過程需要 2 個 RTT,這也是 HTTPS 慢的一個重要原因。而 RSA 發揮的關鍵作用就是對 premaster_secrect 進行了加密和解密。中間者不可能破解 RSA 演算法,也就不可能知道 premaster_secrect,從而保證了密鑰協商過程的安全性。
3.1.1.2 ECDHE 密鑰協商 3.1.1.2.1 DH 與 ECC 演算法原理
ECDHE 演算法實現要複雜很多,主要分為兩部分:diffie-hellman 演算法(簡稱為 DH)及 ECC(橢圓曲線算術)。他們的安全性都是建立在離散對數計算很困難的基礎上。
簡單介紹一下 dh 演算法的實現,先介紹兩個基本概念:
- 本原根:如果整數 a 是素數 p 的本原根,則 a, a^2, …, a^(p-1) 在 mod p 下都不相同。
- 離散對數:對任意整數 b 和素數 p 的本原根 a,存在唯一的指數 i 滿足:
b ≡ a^i mod p (0≤i≤p-1)
則稱 i 是 b 的以 a 為底的模 p 的離散對數。
理解這兩個概念,dh 演算法就非常簡單了,樣本如下:
假設 client 和 server 需要協商密鑰,p=2579,則本原根 a = 2。
1, Client 選擇隨機數 Kc = 123 做為自己的私密金鑰,計算 Yc = a^Kc mod p = 2^123 mod 2579 = 2400,把 Yc 作為公開金鑰發送給 server。
2, Server 選擇隨機數 Ks = 293 作為私密金鑰,計算 Ys = a^Ks mod p = s^293 mod 2579 = 968,把 Ys 作為公開金鑰發送給 client。
3, Client 計算共用密鑰:secrect = Ys^Kc mod (p) = 968^123 mod(2579) = 434
4, Server 計算共用密鑰:secrect = Yc^Ks mod(p) =2400^293 mod(2579) =434
上述公式中的 Ys,Yc,P, a, 都是公開資訊,可以被中間者查看,只有 Ks,Kc 作為私密金鑰沒有公開,當私密金鑰較小時,通過窮舉攻擊能夠計算出共用密鑰,但是當私密金鑰非常大時,窮舉攻擊肯定是不可行的。
DH 演算法有一個比較大的缺陷就是需要提供足夠大的私密金鑰來保證安全性,所以比較消耗 CPU 計算資源。ECC 橢圓曲線算術能夠很好的解決這個問題,224 位的密鑰長度就能達到 RSA2048 位的安全強度。
ECC 的曲線公式描述的其實不是橢圓,只是跟橢圓曲線周長公式形似才叫橢圓曲線密碼編譯算術。ECC 涉及到了有限域、群等近世代數的多個概念,就不做詳細介紹了。
ECC 安全性依賴於這樣一個事實:
P = kQ, 已知 k, Q 求出 P 相對簡單,但是已知 P 和 Q 求出 k 卻非常困難。
上式看起來非常簡單,但有如下約束條件:
1, Q 是一個非常大的質數,p, k, q 都是橢圓曲線有限域上的離散點。
2, 有限域定義了自己的加法和乘法法則,即使 kQ 的運算也非常複雜。
ECC 應用於 Diffie-Hellman 金鑰交換過程如下:
1, 定義一個滿足橢圓方程的有限域,即挑選 p, a, b 滿足如下方程:
y^2 mod p = (x^3+ax +b) mod p
2, 挑選基點 G = (x, y),G 的階為 n。n 為滿足 nG = 0 的最小正整數。
3, Client 選擇私密金鑰 Kc (0 <Kc<n ),產生公開金鑰 Yc =Kc *G
4, server 選擇私密金鑰 Ks 併產生公開金鑰 Ys =Ks*G
5, client 計算共用密鑰 K = Kc*Ys ,server 端計算共用密鑰 Ks*Yc ,這兩者的結果是一樣的,因為:
Kc*Ys = Kc*(Ks*G) = Ks*(Kc*G) = Ks*Yc
由上面描述可知,只要確定 p, a, b 就能確定一條有限域上的橢圓曲線,由於不是所有的橢圓曲線都能夠用於加密,所以 p, a, b 的選取非常講究,直接關係曲線的安全性和計算速度。
Openssl 實現的,也是 FIPS 推薦的 256 位素數域上的橢圓曲線參數定義如下:
質數 p = 115792089210356248762697446949407573530086143415290314195533631308867097853951 階 n = 115792089210356248762697446949407573529996955224135760342422259061068512044369SEED = c49d3608 86e70493 6a6678e1 139d26b7 819f7e90c = 7efba166 2985be94 03cb055c 75d4f7e0 ce8d84a9 c5114abcaf317768 0104fa0d 橢圓曲線的係數 a = 0 橢圓曲線的系統 b = 5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f63bce3c3e 27d2604b 基點 G x = 6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0f4a13945 d898c296 基點 G y = 4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ececbb64068 37bf51f5
3.1.1.2.2 握手過程中的 ECDHE 密鑰協商
簡單介紹了 ECC 和 DH 演算法的數學原理,我們看下 ECDHE 在 TLS 握手過程中的應用。
相比 RSA,ECDHE 需要多發送一個 server_key_exchange 的握手訊息才能完成密鑰協商。
同樣以 TLS1.2 為例,簡單描述一下過程:
1, 瀏覽器發送 client_hello,包含一個隨機數 random1,同時需要有 2 個擴充:
a) Elliptic_curves:用戶端支援的曲線類型和有限域參數。現在使用最多的是 256 位的素數域,參數定義如上節所述。
b) Ec_point_formats:支援的曲線點格式,預設都是 uncompressed。
2, 服務端回複 server_hello,包含一個隨機數 random2 及 ECC 擴充。
3, 服務端回複 certificate,攜帶了認證公開金鑰。
4, 服務端產生 ECDH 臨時公開金鑰,同時回複 server_key_exchange,包含三部分重要內容:
a) ECC 相關的參數。
b) ECDH 臨時公開金鑰。
c) ECC 參數和公開金鑰產生的簽名值,用於用戶端校正。
5, 瀏覽器接收 server_key_exchange 之後,使用認證公開金鑰進行簽名解密和校正,擷取伺服器端的 ECDH 臨時公開金鑰,產生會話所需要的共用密鑰。
至此,瀏覽器端完成了密鑰協商。
6, 瀏覽器產生 ECDH 臨時公開金鑰和 client_key_exchange 訊息,跟 RSA 密鑰協商不同的是,這個訊息不需要加密了。
7, 伺服器處理 client_key_exchang 訊息,擷取用戶端 ECDH 臨時公開金鑰。
8, 伺服器產生會話所需要的共用密鑰。
9, Server 端密鑰協商過程結束。
圖示如下:
圖 7 ECDHE 密鑰協商過程
3.1.2 對稱內容加密
非對稱金鑰交換過程結束之後就得出了本次會話需要使用的對稱金鑰。對稱式加密又分為兩種模式:流式加密和區塊編碼器。流式加密現在常用的就是 RC4,不過 RC4 已經不再安全,微軟也建議的網站盡量不要使用 RC4 流式加密。
一種新的替代 RC4 的流式密碼編譯演算法叫 ChaCha20,它是 google 推出的速度更快,更安全的密碼編譯演算法。目前已經被 android 和 chrome 採用,也編譯進了 google 的開源 openssl 分支 —boring ssl,並且nginx 1.7.4 也支援編譯 boringssl。
區塊編碼器以前常用的模式是 AES-CBC,但是 CBC 已經被證明容易遭受BEAST和LUCKY13 攻擊。目前建議使用的區塊編碼器模式是 AES-GCM,不過它的缺點是計算量大,效能和電量消耗都比較高,不適用於行動電話和平板電腦。
3.2 身份認證
身份認證主要涉及到 PKI 和數位憑證。通常來講 PKI(公開金鑰基礎設施)包含如下部分:
- End entity:終端實體,可以是一個終端硬體或者網站。
- CA:認證簽發機構。
- RA:憑證註冊及審核機構。比如審查申請網站或者公司的真實性。
- CRL issuer:負責認證撤銷列表的發布和維護。
- Repository:負責數位憑證及 CRL 內容儲存和分發。
申請一個受信任的數位憑證通常有如下流程:
1, 終端實體產生公私密金鑰和認證請求。
2, RA 檢查實體的合法性。如果個人或者小網站,這一步不是必須的。
3, CA 簽發認證,發送給申請者。
4, 認證更新到 repository,終端後續從 repository 更新認證,查詢認證狀態等。
目前百度使用的認證是 X509v3 格式,由如下三個部分組成:
1, tbsCertificate(to be signed certificate 待簽署憑證內容),這部分包含了 10 個要素,分別是版本號碼,序號,簽名演算法標識,發行者名稱,有效期間,認證主體名,認證主體公開金鑰資訊,發行商唯一標識,主體唯一標識,擴充等。
2, signatureAlgorithm,簽名演算法標識,指定對 tbsCertificate 進行簽名的演算法。
3, signaturValue(簽名值),使用 signatureAlgorithm 對 tbsCertificate 進行計算得到簽名值。
數位憑證有兩個作用:
1, 身份授權。確保瀏覽器訪問的網站是經過 CA 驗證的可信任的網站。
2, 分發公開金鑰。每個數位憑證都包含了註冊者產生的公開金鑰。在 SSL 握手時會通過 certificate 訊息傳輸給用戶端。比如前文提到的 RSA 認證公開金鑰加密及 ECDHE 的簽名都是使用的這個公開金鑰。
申請者拿到 CA 的認證並部署在網站伺服器端,那瀏覽器發起握手接收到認證後,如何確認這個認證就是 CA 簽發的呢?怎樣避免第三方偽造這個認證?
答案就是數位簽章(digital signature)。數位簽章是認證的防偽標籤,目前使用最廣泛的 SHA-RSA 數位簽章的製作和驗證過程如下:
1, 數位簽章的簽發。首先是使用雜湊函數對待簽名內容進行安全雜湊,產生訊息摘要,然後使用 CA 自己的私密金鑰對訊息摘要進行加密。
2, 數位簽章的校正。使用 CA 的公開金鑰解密簽名,然後使用相同的簽名函數對待簽署憑證內容進行簽名並和服務端數位簽章裡的簽名內容進行比較,如果相同就認為校正成功。
圖 8 數位簽章產生及校正
這裡有幾點需要說明:
- 數位簽章簽發和校正使用的金鑰組是 CA 自己的公私密鑰,跟認證申請者提交的公開金鑰沒有關係。
- 數位簽章的簽發過程跟公開金鑰加密的過程剛好相反,即是用私密金鑰加密,公開金鑰解密。
- 現在大的 CA 都會有憑證鏈結,憑證鏈結的好處一是安全,保持根 CA 的私密金鑰離線使用。第二個好處是方便部署和撤銷,即如果認證出現問題,只需要撤銷相應層級的認證,根憑證依然安全。
- 根 CA 憑證都是自簽名,即用自己的公開金鑰和私密金鑰完成了簽名的製作和驗證。而憑證鏈結上的認證簽名都是使用上一級認證的金鑰組完成簽名和驗證的。
- 怎樣擷取根 CA 和多級 CA 的金鑰組?它們是否可信?當然可信,因為這些廠商跟瀏覽器和作業系統都有合作,它們的公開金鑰都預設裝到了瀏覽器或者作業系統環境裡。比如firefox 就自己維護了一個可信任的 CA 列表,而chrome 和 IE 使用的是作業系統的 CA 列表。
3.3 資料完整性
這部分內容比較好理解,跟平時的 md5 簽名類似,只不過安全要求要高很多。openssl 現在使用的完整性校正演算法有兩種:MD5 或者 SHA。由於 MD5 在實際應用中存在衝突的可能性比較大,所以盡量別採用 MD5 來驗證內容一致性。SHA 也不能使用 SHA0 和 SHA1,中國山東大學的王小雲教授在 2005 年就宣布破解了 SHA-1 完整版演算法。
微軟和 google 都已經宣布 16 年及 17 年之後不再支援 sha1 簽署憑證。
4 HTTPS 使用成本
HTTPS 目前唯一的問題就是它還沒有得到大規模應用,受到的關注和研究都比較少。至於使用成本和額外開銷,完全不用太過擔心。
一般來講,使用 HTTPS 前大家可能會非常關注如下問題:
- 認證費用以及更新維護。大家覺得申請認證很麻煩,認證也很貴,可是認證其實一點都不貴,便宜的一年幾十塊錢,最多也就幾百。而且現在也有了免費的認證機構,比如著名的 mozilla 發起的免費認證項目:let’s encrypt(https://letsencrypt.org/)就支援免費認證安裝和自動更新。這個項目將於今年中旬投入正式使用。
數位憑證的費用其實也不高,對於中小網站可以使用便宜甚至免費的數位憑證服務(可能存在安全隱患),像著名的 verisign 公司的認證一般也就幾千到幾萬塊一年不等。當然如果公司對認證的需求比較大,定製性要求高,可以建立自己的 CA 網站,比如 google,能夠隨意簽發 google 相關認證。
- HTTPS 降低使用者訪問速度。HTTPS 對速度會有一定程度的降低,但是只要經過合理最佳化和部署,HTTPS 對速度的影響完全可以接受。在很多情境下,HTTPS 速度完全不遜於 HTTP,如果使用 SPDY,HTTPS 的速度甚至還要比 HTTP 快。
大家現在使用百度 HTTPS 安全搜尋,有感覺到慢嗎?
- HTTPS 消耗 CPU 資源,需要增加大量機器。前面介紹過非對稱金鑰交換,這是消耗 CPU 計算資源的大戶,此外,對稱加解密,也需要 CPU 的計算。
同樣地,只要合理最佳化,HTTPS 的機器成本也不會明顯增加。對於中小網站,完全不需要增加機器也能滿足效能需求。
HTTPS 協議和原理