您好,登錄后才能下訂單哦!
這篇文章給大家介紹HTTPS協議和原理是什么,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
HTTPS 協議和原理
前言
百度已經于近日上線了全站 HTTPS 的安全搜索,默認會將 HTTP 請求跳轉成 HTTPS。本文重點介紹 HTTPS 協議 ,并簡單介紹部署全站 HTTPS 的意義。
HTTPS 協議概述
HTTPS 可以認為是 HTTP + TLS。HTTP 協議大家耳熟能詳了,目前大部分 WEB 應用和網站都是使用 HTTP 協議傳輸的。
TLS 是傳輸層加密協議,它的前身是 SSL 協議,最早由 netscape 公司于 1995 年發布,1999 年經過 IETF 討論和規范后,改名為 TLS。如果沒有特別說明,SSL 和 TLS 說的都是同一個協議。
HTTP 和 TLS 在協議層的位置以及 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 協議一個非常重大的改革。不管是安全性還是用戶訪問速度都會有質的提升。不過目前沒有明確的發布時間。
HTTPS 功能介紹
百度使用 HTTPS 協議主要是為了保護用戶隱私,防止流量劫持。HTTP 本身是明文傳輸的,沒有經過任何安全處理。例如用戶在百度搜索了一個關鍵字,比如 “蘋果手機”,中間者完全能夠查看到這個信息,并且有可能打電話過來騷擾用戶。也有一些用戶投訴使用百度時,發現首頁或者結果頁面浮了一個很長很大的廣告,這也肯定是中間者往頁面插的廣告內容。如果劫持技術比較低劣的話,用戶甚至無法訪問百度。
這里提到的中間者主要指一些網絡節點,是用戶數據在瀏覽器和百度服務器中間傳輸必須要經過的節點。比如 WIFI 熱點,路由器,防火墻,反向代理,緩存服務器等。
在 HTTP 協議下,中間者可以隨意嗅探用戶搜索內容,竊取隱私甚至篡改網頁。不過 HTTPS 是這些劫持行為的克星,能夠完全有效地防御。總體來說,HTTPS 協議提供了三個強大的功能來對抗上述的劫持行為:
內容加密。瀏覽器到百度服務器的內容都是以加密形式傳輸,中間者無法直接查看原始內容。
身份認證。保證用戶訪問的是百度服務,即使被 DNS 劫持到了第三方站點,也會提醒用戶沒有訪問百度服務,有可能被劫持
數據完整性。防止內容被第三方冒充或者篡改。
那 HTTPS 是如何做到上述三點的呢?下面從原理角度介紹一下。
HTTPS 原理介紹
內容加密
加密算法一般分為兩種,對稱加密和非對稱加密。所謂對稱加密(也叫密鑰加密)就是指加密和解密使用的是相同的密鑰。而非對稱加密(也叫公鑰加密)就是指加密和解密使用了不同的密鑰。
非對稱密鑰交換
在非對稱密鑰交換算法出現以前,對稱加密一個很大的問題就是不知道如何安全生成和保管密鑰。非對稱密鑰交換過程主要就是為了解決這個問題,使得對稱密鑰的生成和使用更加安全。
密鑰交換算法本身非常復雜,密鑰交換過程涉及到隨機數生成,模指數運算,空白補齊,加密,簽名等操作。
常見的密鑰交換算法有 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。非常消耗性能。
百度只支持 RSA 和 ECDH_RSA 密鑰交換算法。原因是:
ECDHE 支持 ECC 加速,計算速度更快。支持 PFS,更加安全。支持 false start,用戶訪問速度更快。
目前還有至少 20% 以上的客戶端不支持 ECDHE,我們推薦使用 RSA 而不是 DH 或者 DHE,因為 DH 系列算法非常消耗 CPU(相當于要做兩次 RSA 計算)。
需要注意通常所說的 ECDHE 密鑰交換默認都是指 ECDHE_RSA,使用 ECDHE 生成 DH 算法所需的公私鑰,然后使用 RSA 算法進行簽名最后再計算得出對稱密鑰。
非對稱加密相比對稱加密更加安全,但也存在兩個明顯缺點:
CPU 計算資源消耗非常大。一次完全 TLS 握手,密鑰交換時的非對稱解密計算量占整個握手過程的 90% 以上。而對稱加密的計算量只相當于非對稱加密的 0.1%,如果應用層數據也使用非對稱加解密,性能開銷太大,無法承受。
非對稱加密算法對加密內容的長度有限制,不能超過公鑰長度。比如現在常用的公鑰長度是 2048 位,意味著待加密內容不能超過 256 個字節。
所以公鑰加密目前只能用來作密鑰交換或者內容簽名,不適合用來做應用層傳輸內容的加解密。
非對稱密鑰交換算法是整個 HTTPS 得以安全的基石,充分理解非對稱密鑰交換算法是理解 HTTPS 協議和功能的關鍵。
下面分別通俗地介紹一下 RSA 和 ECDHE 在密鑰交換過程中的應用。
RSA 在密鑰交換過程中的應用
RSA 算法的原理是乘法不可逆或者大數因子很難分解。RSA 的推導實現涉及到了歐拉函數和費馬定理及模反元素的概念,有興趣的讀者可以自行百度。
RSA 算法是統治世界的最重要算法之一,而且從目前來看,RSA 也是 HTTPS 體系中最重要的算法,沒有之一。 下面用一個簡單的示例介紹一下 RSA 的神奇妙用。
假設一個網站需要使用 HTTPS 協議,那么它首先就得申請數字證書,申請證書之前需要生成一對公鑰和私鑰,為了方便說明問題,假設 server 的密鑰長度只有 8 位,事實上現在的服務器證書至少是 2048 位長。
隨機挑選兩個質數 p, q,使得 pq 接近 2 的 8 次方 = 256, 假設 p = 13, q = 19。n = pq = 13*19 = 247。
挑選一個數 e,滿足 1< e < (p-1)(q-1) 并且 e 與 (p-1)(q-1) 互質,假設 e = 53。
計算 e 關于 n 的模反元素 , ed≡1 (mod φ(n)), d =
實際應用中,(n,e) 組成了公鑰對,(n,d)組成了私鑰對。公鑰一般都注冊到了證書里,任何人都能直接查看,比如百度證書的公鑰對如下圖,其中最末 6 個數字(010001)換算成 10 進制就是 65537,也就是公鑰對中的 e, 取值比較小的原因有兩個:
減小 client 端的計算強度,特別是現在移動終端的計算能力比較弱,較小的公鑰使得 CPU 計算會更快。
加大 server 端的破解難度。e 比較小,d 必然會非常大。所以 d 的取值空間也會非常大。
ECDHE 算法在密鑰交換中的應用
ECDHE 算法實現要復雜很多,依賴的數學原理主要是 ECC 橢圓曲線和離散對數。詳細概念不做說明,示例介紹一下。
對稱內容加密
非對稱密鑰交換過程結束之后就得出了本次會話需要使用的對稱密鑰。對稱加密又分為兩種模式:流式加密和分組加密。流式加密現在常用的就是 RC4,不過 RC4 已經不再安全,微軟也建議網站盡量不要使用 RC4 流式加密。
一種新的替代 RC4 的流式加密算法叫 ChaCha20,它是 google 推出的速度更快,更安全的加密算法。目前已經被 android 和 chrome 采用,也編譯進了 google 的開源 openssl 分支---boring ssl,并且 nginx 1.7.4 也支持編譯 boringssl。
分組加密以前常用的模式是 AES-CBC,但是 CBC 已經被證明容易遭受 BEAST 和 LUCKY13 攻擊。目前建議使用的分組加密模式是 AES-GCM,不過它的缺點是計算量大,性能和電量消耗都比較高,不適用于移動電話和平板電腦。
數據完整性
這部分內容比較好理解,跟平時的 md5 簽名類似,只不過安全要求要高很多。openssl 現在使用的完整性校驗算法有兩種:MD5 或者 SHA。由于 MD5 在實際應用中存在沖突的可能性比較大,所以盡量別采用 MD5 來驗證內容一致性。SHA 也不能使用 SHA0 和 SHA1,中國山東大學的王小云教授在 2005 年就宣布破解了 SHA-1 完整版算法。微軟和 google 都已經宣布 16 年及 17 年之后不再支持 sha1 簽名證書。
身份認證
身份認證主要涉及到 PKI 和數字證書。數字證書有兩個作用:
身份授權。確保瀏覽器訪問的網站是經過 CA 驗證的可信任的網站。
分發公鑰。每個數字證書都包含了注冊者生成的公鑰。在 SSL 握手時會通過 certificate 消息傳輸給客戶端。
這里簡單介紹一下數字證書是如何驗證網站身份的,PKI 體系的具體知識不做詳細介紹。
證書申請者首先會生成一對密鑰,包含公鑰和密鑰,然后把公鑰及域名還有 CU 等資料制作成 CSR 格式的請求發送給 RA,RA 驗證完這些內容之后(RA 會請獨立的第三方機構和律師團隊確認申請者的身份)再將 CSR 發送給 CA,CA 然后制作 X.509 格式的證書。
申請者拿到 CA 的證書并部署在網站服務器端,那瀏覽器發起握手接收到證書后,如何確認這個證書就是 CA 簽發的呢?怎樣避免第三方偽造這個證書?
答案就是數字簽名(digital signature)。數字簽名可以認為是一個證書的防偽標簽,目前使用最廣泛的 SHA-RSA 數字簽名的制作和驗證過程如下:
數字簽名的簽發。首先是使用哈希函數對證書數據哈希,生成消息摘要,然后使用 CA 自己的私鑰對證書內容和消息摘要進行加密。
數字簽名的校驗。使用 CA 的公鑰解密簽名,然后使用相同的簽名函數對證書內容進行簽名并和服務端的數字簽名里的簽名內容進行比較,如果相同就認為校驗成功。
這里有幾點需要說明:
數字簽名簽發和校驗使用的密鑰對是 CA 自己的公私密鑰,跟證書申請者提交的公鑰沒有關系。
數字簽名的簽發過程跟公鑰加密的過程剛好相反,即是用私鑰加密,公鑰解密。
現在大的 CA 都會有證書鏈,證書鏈的好處一是安全,保持根 CA 的私鑰離線使用。第二個好處是方便部署和撤銷,即如何證書出現問題,只需要撤銷相應級別的證書,根證書依然安全。
根 CA 證書都是自簽名,即用自己的公鑰和私鑰完成了簽名的制作和驗證。而證書鏈上的證書簽名都是使用上一級證書的密鑰對完成簽名和驗證的。
怎樣獲取根 CA 和多級 CA 的密鑰對?它們是否可信?當然可信,因為這些廠商跟瀏覽器和操作系統都有合作,它們的公鑰都默認裝到了瀏覽器或者操作系統環境里。比如 firefox 就自己維護了一個可信任的 CA 列表,而 chrome 和 IE 使用的是操作系統的 CA 列表。
HTTPS 使用成本
HTTPS 目前唯一的問題就是它還沒有得到大規模應用,受到的關注和研究都比較少。至于使用成本和額外開銷,完全不用太過擔心。
一般來講,使用 HTTPS 前大家可能會非常關注如下問題:
證書費用以及更新維護。大家覺得申請證書很麻煩,證書也很貴,可是證書其實一點都不貴,便宜的一年幾十塊錢,最多也就幾百。而且現在也有了免費的證書機構,比如著名的 mozilla 發起的免費證書項目:let’s encrypt就支持免費證書安裝和自動更新。這個項目將于今年中旬投入正式使用。 數字證書的費用其實也不高,對于中小網站可以使用便宜甚至免費的數字證書服務(可能存在安全隱患),像著名的 verisign 公司的證書一般也就幾千到幾萬塊一年不等。當然如果公司對證書的需求比較大,定制性要求高,可以建立自己的 CA 站點,比如 google,能夠隨意簽發 google 相關證書。
HTTPS 降低用戶訪問速度。HTTPS 對速度會有一定程度的降低,但是只要經過合理優化和部署,HTTPS 對速度的影響完全可以接受。在很多場景下,HTTPS 速度完全不遜于 HTTP,如果使用 SPDY,HTTPS 的速度甚至還要比 HTTP 快。 大家現在使用百度 HTTPS 安全搜索,有感覺到慢嗎?
HTTPS 消耗 CPU 資源,需要增加大量機器。前面介紹過非對稱密鑰交換,這是消耗 CPU 計算資源的大戶,此外,對稱加解密,也需要 CPU 的計算。 同樣地,只要合理優化,HTTPS 的機器成本也不會明顯增加。對于中小網站,完全不需要增加機器也能滿足性能需求。
關于HTTPS協議和原理是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。