大型網站HTTPS 實踐(一)| HTTPS 協議和原理

作者 | 百度HTTPS技術支持團隊

百度已經上線了全站 HTTPS 的安全搜索,默認會將 HTTP 請求跳轉成 HTTPS。本文就著重介紹了 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 原理介紹

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。非常消耗性能。

百度只支持 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 在密鑰交換過程中的應用。

RSA 在密鑰交換過程中的應用

RSA 算法的原理是乘法不可逆或者大數因子很難分解。RSA 的推導實現涉及到了歐拉函數和費馬定理及模反元素的概念,有興趣的讀者可以自行百度。

RSA 算法是統治世界的最重要算法之一,而且從目前來看,RSA 也是 HTTPS 體系中最重要的算法,沒有之一。

下面用一個簡單的示例介紹一下 RSA 的神奇妙用。

假設一個網站需要使用 HTTPS 協議,那么它首先就得申請數字證書,申請證書之前需要生成一對公鑰和私鑰,為了方便說明問題,假設 server 的密鑰長度只有 8 位,事實上現在的服務器證書至少是 2048 位長。

1.隨機挑選兩個質數 p, q,使得 p_q 接近 2 的 8 次方 = 256, 假設 p = 13, q = 19。n = p_q = 13*19 = 247。

2.挑選一個數 e,滿足 1< e < (p-1)(q-1) 并且 e 與 (p-1)(q-1) 互質,假設 e = 53。

3.計算 e 關于 n 的模反元素 , ed≡1 (mod φ(n)), d =
實際應用中,(n,e) 組成了公鑰對,(n,d)組成了私鑰對。公鑰一般都注冊到了證書里,任何人都能直接查看,比如百度證書的公鑰對如下圖,其中最末 6 個數字(010001)換算成 10 進制就是 65537,也就是公鑰對中的 e, 取值比較小的原因有兩個:

4.減小 client 端的計算強度,特別是現在移動終端的計算能力比較弱,較小的公鑰使得 CPU 計算會更快。

5.加大 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,不過它的缺點是計算量大,性能和電量消耗都比較高,不適用于移動電話和平板電腦。

2. 數據完整性

這部分內容比較好理解,跟平時的 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 數字簽名的制作和驗證過程如下:

1、數字簽名的簽發。首先是使用哈希函數對證書數據哈希,生成消息摘要,然后使用 CA 自己的私鑰對證書內容和消息摘要進行加密。

2、數字簽名的校驗。使用 CA 的公鑰解密簽名,然后使用相同的簽名函數對證書內容進行簽名并和服務端的數字簽名里的簽名內容進行比較,如果相同就認為校驗成功。
這里有幾點需要說明:

1、數字簽名簽發和校驗使用的密鑰對是 CA 自己的公私密鑰,跟證書申請者提交的公鑰沒有關系。

2、數字簽名的簽發過程跟公鑰加密的過程剛好相反,即是用私鑰加密,公鑰解密。

3、現在大的 CA 都會有證書鏈,證書鏈的好處一是安全,保持根 CA 的私鑰離線使用。第二個好處是方便部署和撤銷,即如何證書出現問題,只需要撤銷相應級別的證書,根證書依然安全。

4、根 CA 證書都是自簽名,即用自己的公鑰和私鑰完成了簽名的制作和驗證。而證書鏈上的證書簽名都是使用上一級證書的密鑰對完成簽名和驗證的。

5、怎樣獲取根 CA 和多級 CA 的密鑰對?它們是否可信?當然可信,因為這些廠商跟瀏覽器和操作系統都有合作,它們的公鑰都默認裝到了瀏覽器或者操作系統環境里。比如 firefox 就自己維護了一個可信任的 CA 列表,而 Chrome 和 IE 使用的是操作系統的 CA 列表。

HTTPS 使用成本

HTTPS 目前唯一的問題就是它還沒有得到大規模應用,受到的關注和研究都比較少。至于使用成本和額外開銷,完全不用太過擔心。

一般來講,使用 HTTPS 前大家可能會非常關注如下問題:

1.證書費用以及更新維護。大家覺得申請證書很麻煩,證書也很貴,可是證書其實一點都不貴,便宜的一年幾十塊錢,最多也就幾百。而且現在也有了免費的證書機構,比如著名的 mozilla 發起的免費證書項目:let’s encrypt就支持免費證書安裝和自動更新。這個項目將于今年中旬投入正式使用。

數字證書的費用其實也不高,對于中小網站可以使用便宜甚至免費的數字證書服務(可能存在安全隱患),像著名的 verisign 公司的證書一般也就幾千到幾萬塊一年不等。當然如果公司對證書的需求比較大,定制性要求高,可以建立自己的 CA 站點,比如 google,能夠隨意簽發 google 相關證書。

2.HTTPS 降低用戶訪問速度。HTTPS 對速度會有一定程度的降低,但是只要經過合理優化和部署,HTTPS 對速度的影響完全可以接受。在很多場景下,HTTPS 速度完全不遜于 HTTP,如果使用 SPDY,HTTPS 的速度甚至還要比 HTTP 快。

大家現在使用百度 HTTPS 安全搜索,有感覺到慢嗎?

3.HTTPS 消耗 CPU 資源,需要增加大量機器。前面介紹過非對稱密鑰交換,這是消耗 CPU 計算資源的大戶,此外,對稱加解密,也需要 CPU 的計算。

同樣地,只要合理優化,HTTPS 的機器成本也不會明顯增加。對于中小網站,完全不需要增加機器也能滿足性能需求。

后記

國外的大型互聯網公司很多已經啟用了全站 HTTPS,這也是未來互聯網的趨勢。國內的大型互聯網并沒有全站部署 HTTPS,只是在一些涉及賬戶或者交易的子頁面 / 子請求上啟用了 HTTPS。百度搜索首次全站部署 HTTPS,對國內互聯網的全站 HTTPS 進程必將有著巨大的推動作用。

目前互聯網上關于 HTTPS 的中文資料比較少,本文就著重介紹了 HTTPS 協議涉及到的重要知識點和平時不太容易理解的盲區,希望能對大家理解 HTTPS 協議有幫助。百度 HTTPS 性能優化涉及到大量內容,從前端頁面、后端架構、協議特性、加密算法、流量調度、架構和運維、安全等方面都做了大量工作。本系列的文章將一一進行介紹。

Brilliant Open Web

BOW(Brilliant Open Web)團隊,是一個專門的Web技術建設小組,致力于推動 Open Web 技術的發展,讓Web重新成為開發者的首選。

BOW 關注前端,關注Web;剖析技術、分享實踐;談談學習,也聊聊管理。

關注 OpenWeb開發者,回復“加群”,讓我們一起推動 OpenWeb技術的發展!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535878.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535878.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535878.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MongoDB(一):簡介

1、MongoDB概述 MongoDB 是由C語言編寫的&#xff0c;是一個基于分布式文件存儲的開源數據庫系統。在高負載的情況下&#xff0c;添加更多的節點&#xff0c;可以保證服務器性能。MongoDB 旨在為WEB應用提供可擴展的高性能數據存儲解決方案。 MongoDB 是一款流行的開源文檔型…

大型網站HTTPS實踐:HTTPS對性能的影響

作者 | 百度HTTPS技術支持團隊 百度已經上線了全站 HTTPS 的安全搜索&#xff0c;默認會將 HTTP 請求跳轉成 HTTPS。百度 HTTPS性能優化涉及到大量內容&#xff0c;從前端頁面、后端架構、協議特性、加密算法、流量調度、架構和運維、安全等方面都做了大量工作。本系列的文章將…

Redis(十三):Redis實現樂觀鎖

1、悲觀鎖與樂觀鎖 樂觀鎖和悲觀鎖是一種程序設計思想&#xff0c;而不是具體的代碼。樂觀鎖和悲觀鎖應用的場景有很多&#xff0c;在數據庫和多線程等等都會用到。 悲觀鎖&#xff1a;總是假設最壞的情況&#xff0c;每次去拿數據的時候都認為別人會修改&#xff0c;所以每次…

PWA將帶來新一輪大前端技術洗牌?

作者 | 彭星 編輯 | 尾尾 一、回顧歷史&#xff1a;移動時代之初&#xff0c;Web遭遇兩大枷鎖 Web 在移動時代遭遇兩大枷鎖1.Web 在移動時代遭遇兩大枷鎖 當 Web 自信滿滿&#xff0c;步入移動時代之時&#xff0c;它還沒有做好充足的準備。 回顧 2014 到 2015 年那段時間…

Redis(十四):Jedis

Jedis是Redis官方推薦的Java連接開發工具。要在Java開發中使用好Redis中間件&#xff0c;必須對Jedis熟悉才能寫成漂亮的代碼&#xff01; 1、新建Maven工程&#xff0c;導入對應依賴 <dependencies><dependency><groupId>redis.clients</groupId>&l…

高級精致智能快捷的Web設計原則案例

作者 | 百度搜索用戶體驗中心 《Web設計指南》分為設計原則、基礎規范兩方面主要內容&#xff0c;同時會提供相應的實際案例及資源下載。關注OpenWeb開發者&#xff0c;回復“設計指南”&#xff0c;即可獲取已發布資源。 設計原則之高級精致 簡潔并不等于粗糙沒有細節&#x…

Linux系列(一):簡介與目錄結構

1、Linux簡介 1.1、起源 Linux出現于1991年&#xff0c;是由芬蘭赫爾辛基大學學生Linus Torvalds和后來加入的眾多愛好者共同開發完成 1.2、Linux特點 多用戶&#xff0c;多任務&#xff0c;豐富的網絡功能&#xff0c;可靠的系統安全&#xff0c;良好的可移植性&#xff0c;…

日常問題——解決mac下 ssh: connect to host localhost port 22: Connection refused

問題描述&#xff1a; 今天使用ssh 登陸本地時即使用ssh localhost出現了 ssh: connect to host localhost port 22: Connection refused 錯誤&#xff01; 然后在網上看了很多的解決方案&#xff0c;也都是千篇一律&#xff0c;大多數是針對ssh安沒安裝的&#xff1f;那肯定是…

大型網站的HTTPS實踐:基于協議和配置的優化

作者 | 百度HTTPS技術支持團隊 百度已經上線了全站 HTTPS 的安全搜索&#xff0c;默認會將 HTTP 請求跳轉成 HTTPS。百度 HTTPS性能優化涉及到大量內容&#xff0c;在前端頁面、后端架構、協議特性、加密算法、流量調度、架構和運維、安全等方面都做了大量工作。本系列的文章將…

初識Hadoop:大數據與Hadoop概述

1、大數據概述 大數據&#xff08;big data&#xff09;&#xff0c;IT行業術語&#xff0c;是指無法在一定時間范圍內用常規軟件工具進行捕捉、管理和處理的數據集合&#xff0c;是需要新處理模式才能具有更強的決策力、洞察發現力和流程優化能力的海量、高增長率和多樣化的信…

W3C近期要聞:W3C戰略重點報告新版發布

作者 | W3C中國 「OpenWeb開發者」依托于BOW&#xff08;Brillant Open Web&#xff09;團隊&#xff0c;是一個專門的 Web 技術建設小組&#xff0c;致力于推動 OpenWeb 技術的發展&#xff0c;將不定期為讀者同步W3C要聞。 注&#xff1a;由于微信不支持外鏈&#xff0c;了解…

Hadoop的安裝及配置

PS:最新安裝教程請參考Hadoop的安裝與配置&#xff08;設置單節點群集&#xff09;詳細教程 1、Hadoop安裝前準備工作&#xff1a; 在開始Hadoop安裝與配置之前&#xff0c;需要準備的環境&#xff1a;Linux系統、配置JDK環境變量。 2、安裝 我們可以到Apache Hadoop的官網ht…

在 PWA 中使用 App Shell 模型提升性能和用戶感知體驗

作者&#xff5c;潘宇琪 編輯&#xff5c;Daisy 在構建 PWA 應用時&#xff0c;使用 App Shell 模型能夠在視覺和首屏加載速度方面帶來用戶體驗的提升。另外&#xff0c;在配合 Service Worker 離線緩存之后&#xff0c;用戶在后續訪問中將得到快速可靠的瀏覽體驗。 在實踐過…

【轉】超酷的 mip-infinitescroll 無限滾動(無限下拉)

寫在前面 無限滾動技術&#xff08;又叫做無限下拉技術&#xff09;被廣泛應用于新聞類&#xff0c;圖片預覽類網站。對用戶來講&#xff0c;使用無限滾動的頁面有源源不斷的信息可以預覽&#xff0c;增加用戶在頁面的停留時長。技術上原理也很簡單&#xff0c;在頁面加載時加…

日常問題——Mac下新建目錄報Read-only file system

問題描述&#xff1a; 今天在根目錄下&#xff0c;新建目錄時出現了Read-only file system提示為只讀的錯誤。電腦最近并沒有非正常關機之類可能導致文件損傷的操作&#xff0c;但是最近倒是進行了一次系統更新。 解決方案&#xff08;過程&#xff09;&#xff1a; 從系統更…

MongoDB(二):MongoDB的安裝

這里以OSX系統為例&#xff0c;window和linux可以參考https://www.runoob.com/mongodb/mongodb-linux-install.html 1、我們使用 curl 命令來下載安裝&#xff1a; # 進入 /usr/local cd /usr/local# 下載 sudo curl -O https://fastdl.mongodb.org/osx/mongodb-osx-ssl-x86_…

百度推出 MIP Baidu Path鏈接

在站長將站點 MIP 化時&#xff0c;需要關注 URL 的一共有三個&#xff1a;MIP URL, MIP-Cache URL 以及 MIP Baidu Path。 從 URL 說起 在互聯網中&#xff0c;URL 定義頁面的地址&#xff0c;每個 URL 對應一個頁面。而 MIP URL 則是 MIP 頁的原始地址&#xff0c;指向托管…

Postman接口測試(超詳細整理)

常用的接口測試工具主要有以下幾種 Postman&#xff1a;簡單方便的接口調試工具&#xff0c;便于分享和協作。具有接口調試&#xff0c;接口集管理&#xff0c;環境配置&#xff0c;參數化&#xff0c;斷言&#xff0c;批量執行&#xff0c;錄制接口&#xff0c;Mock Server, …

mip-link 組件功能升級說明

背景描述 某個頁面被多少頁面引用&#xff08;在其他頁面上有指向這個頁面的 a 標簽&#xff09;&#xff0c;是搜索引擎判斷這個頁面價值的其中一個因子。這里的搜索引擎不只是指百度&#xff0c;還包括國內外其他的搜索引擎。 MIP 在最初設計 MIP url 跳轉邏輯實現時&#…

日常問題——使用Xshell 連接虛擬機報錯 Disconnected from remote host

問題描述&#xff1a; 使用Xshell進行連接虛擬機的操作時出現了Disconnected from remote host的錯誤&#xff01; 解決方案&#xff08;過程&#xff09;&#xff1a; 1、vim /etc/ssh/sshd_config 2、#UseDNS yes改為UseDNS no 3、重啟service sshd restart 問題解決&…