精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

GoLang:你真的了解 HTTPS 嗎?

網絡 網絡管理
由于筆者對 HTTPS 的認知也僅停留在 “HTTPS 比 HTTP 更安全”的層面上,在項目開發中遇到很多通信相關的問題經常束手無策,因此沉下心來,認認真真學習了 HTTPS 并記錄成此文。

一直以來,在實驗室甚至整個公司特別強調“安全和隱私”,近半年,筆者在用 GoLang 開發智能邊緣計算設備的網絡通信項目時,常被要求務必重視“通信的安全和隱私”。期間,對接了多個合作方,有的要求“公網下要防止域名劫持”,有的要求“客戶端上報要帶‘證書’啊,更安全”,還有要求除了要用 HTTPS,還要在業務邏輯上再進行二次哈希、摘要、加密等等。由于筆者對 HTTPS 的認知也僅停留在 “HTTPS 比 HTTP 更安全”的層面上,在項目開發中遇到很多通信相關的問題經常束手無策,因此沉下心來,認認真真學習了 HTTPS 并記錄成此文。

一、HTTPS 之靈魂三問

要說 HTTPS,搞 IT 的甚至是不搞 IT 的,都知道:“HTTPS 比 HTTP 安全”。因此但凡要開發涉及網絡傳輸的項目時,得到的需求一定有:“要用 HTTPS”。

1. HTTPS 是什么?

維基百科對 HTTPS 的解釋是:

超文本傳輸安全協議(英語:HyperText Transfer Protocol Secure,縮寫:HTTPS;常稱為 HTTP over TLS、HTTP over SSL 或 HTTP Secure)是一種通過計算機網絡進行安全通信的傳輸協議。HTTPS 經由 HTTP 進行通信,但利用 SSL/TLS 來加密數據包。HTTPS 開發的主要目的,是提供對網站服務器的身份認證,保護交換數據的隱私與完整性。這個協議由網景公司(Netscape)在 1994 年首次提出,隨后擴展到互聯網上。

抓重點:HTTPS=HTTP over SSL/TLS,也就是說,HTTPS 在傳輸層 TCP 和應用層 HTTP 之間,多走了一層 SSL/TLS。

由此可見,TLS/SSL 是 HTTPS 的核心! 那么,這個TLS/SSL又是何方神圣呢?文章How to use SSL/TLS to Secure Your Communications: The Basics指出:

The SSL/TLS protocol functions between two layers of the OSI Presentation layer.The handshake and record layers operate over TCP/IP to encrypt data received directly from the Application layer.

SSL/TLS 協議作用在傳輸層和應用層之間,對應用層數據進行加密傳輸。

借用文中的圖,可以直觀感受到:SSL和TLS都是加密協議。SSL,全稱 Secure Socket Layer,在 1994 年由網景公司(Netscape)最早提出 1.0 版本;TLS,全稱 Transport Layer Security,則是 1999 年基于 SSL3.0 版本上改進而來的。官方建議棄用 SSL 而保留和采用 TLS,但是由于歷史原因,SSL 仍然存在,而且很多人已經習慣 SSL 這個名詞,因此現在索性就叫成 SSL/TLS。

2. HTTPS 為什么?

肯定有不少同學不假思索:“當然是 HTTP 不安全,HTTPS 安全,所以選擇 HTTPS 唄!”那么,HTTPS 比 HTTP“好”在哪里?

維基百科上對 HTTP 的解釋如下:

設計 HTTP 最初的目的是為了提供一種發布和接收 HTML 頁面的方法。

HTTP 的發展是由蒂姆·伯納斯-李于 1989 年在歐洲核子研究組織(CERN)所發起。HTTP 的標準制定由萬維網協會(World Wide Web Consortium,W3C)和互聯網工程任務組(Internet Engineering Task Force,IETF)進行協調,最終發布了一系列的 RFC,其中最著名的是 1999 年 6 月公布的 RFC 2616,定義了 HTTP 協議中現今廣泛使用的一個版本——HTTP 1.1。

HTTP 協議是為了傳輸網頁超文本(文本、圖像、多媒體資源),以及規范客戶端和服務器端之間互相請求資源的方法的應用層協議。在 1989 年最早推出了 HTTP 0.9 版本,而 1999 年公布的 HTTP 1.1 是到目前(2020 年)仍舊廣泛使用的版本。

但是這個 HTTP 1.1 版本存在一個很大的問題-明文傳輸(Plaintext/Clear Text),這個問題在互聯網時代的今天是致命的,一旦數據在公共網絡中被第三方截獲,其通信內容輕而易舉地就被竊取了。

因此,HTTPS 應運而生,它被公認的三大優勢有:

  • 數據加密,防竊聽
  • 身份驗證,防冒充
  • 完整性校驗,防篡改

啰嗦說一句:第 1 點確實是解決了 HTTP 明文傳輸;至于第 2 和第 3 點,其他一些應用層協議也會遇到(服務端被冒充、數據被篡改是網絡傳輸中“較常見”的問題)。

再插一句題外話:2015 年推出的 HTTP 2 在 HTTP 1.1 的基礎上有很大改進,其中一點就是 HTTPS。

3. HTTPS 怎么做?

本文接下來將從 HTTPS 的 3 個優勢展開說明,即:

  • 數據加密,即 HTTPS 是怎么進行數據加密的。本章介紹 HTTPS 中的對稱加密和非對稱加密
  • 身份驗證,即 HTTPS 是怎么讓客戶端相信“發給我數據的服務端是我想要的服務器”。本章介紹 HTTPS 的 CA 和證書
  • 完整性校驗,即 HTTPS 是怎么做數據完整性校驗以防止被篡改。本章介紹 HTTPS 的哈希

最后,為了整篇文章的完整性,還會增加以下幾個內容:

  • HTTPS 流程,即客戶端和服務器端 HTTPS 通信全過程
  • 實際問題,記錄了筆者在實戰中遇到 HTTPS 相關問題

二、數據加密:HTTPS 的對稱加密和非對稱加密

相信不少同學會說"對稱加密和非對稱加密有什么好講的?前者只有一把密鑰做加解密;后者有兩把密鑰,公鑰和私鑰,互為加解密,公鑰給對方,私鑰自己用。HTTPS 兩者都有。好了,這章可以結束啦。"

三個問題:

  • HTTPS 為什么同時要有對稱加密和非堆成加密兩種加密方式?
  • HTTPS 對稱加密的密鑰(本文稱為 SK,下同)如何產生和傳輸?
  • HTTPS 的有幾套非對稱加密?目的是什么?是否可以省略?

好,一個問題一個問題來。

問題 1:HTTPS 為什么同時要有對稱加密和非對稱加密兩種加密方式?

默認各位同學已經知曉對稱加密和非對稱加密(了解基本原理即可),不清楚的同學推薦閱讀知乎文章-《對稱加密與非對稱加密》,文章最后指出了這兩個加密方式的優缺點,原文如下:

(1)對稱加密加密與解密使用的是同樣的密鑰,所以速度快,但由于需要將密鑰在網絡傳輸,所以安全性不高。

(2) 非對稱加密使用了一對密鑰,公鑰與私鑰,所以安全性高,但加密與解密速度慢。

那么解決辦法有嗎?有,文章隨后說道:

(3)解決的辦法是將對稱加密的密鑰使用非對稱加密的公鑰進行加密,然后發送出去,接收方使用私鑰進行解密得到對稱加密的密鑰,然后雙方可以使用對稱加密來進行溝通。

確實,HTTPS(最開始)就是這么做的!其思路大致如下:

  • 首先一定要明確HTTPS既有對稱加密,又有非對稱加密。
  • 由于對稱加密性能高速度快,因此在傳輸數據時(也就是對話內容)采用對稱加密。
  • 但是對稱加密的密鑰SK,既沒辦法預先設置(密鑰不可能只有一把,服務器端維護大量密鑰也不具備可行性),因此只能選擇在對話前通過網絡協商出一把新的SK。
  • 為了確保SK的傳輸安全,使用非對稱加密來協商SK。

HTTPS 的這種設計同時兼顧了安全和效率,贊嘆先驅們的智慧!

問題 2:HTTPS 對稱加密的密鑰 SK 如何產生和傳輸?

通過第一個問題,我們知道了 HTTPS 分為2 個過程:

  • 協商對稱加密密鑰 SK 的非對稱加密階段,稱為TLS 握手階段。
  • 使用 SK 對數據(對話內容)進行對稱加密的階段,稱為數據通信階段。

過程 2數據通信階段:發送端首先用密鑰 SK 對通信內容進行對稱加密,接著通過網絡傳輸出去;對端收到數據后,用 SK 先將數據解密,于是就得到了通信內容。這里筆者有一個問題尚未求證:在數據傳輸過程中,是否會對通信數據進行哈希以確保其不被篡改?姑且記一筆。

過程 1TLS 握手階段:協商密鑰 SK。網上關于這個知識點的文章有很多,然而一些已經過時,一些則不全。就協商密鑰 SK 這塊,筆者推薦《掃盲 HTTPS 和 SSL/TLS 協議[3]:密鑰交換(密鑰協商)算法及其原理》和《密鑰協商機制》。本文直接扔出結論,HTTPS 協商對稱加密密鑰 SK 的辦法有很多種,介紹 3 種較為常見的辦法:

  • 基于非對稱加密算法
  • 基于專用密鑰交換算法,常見有 DH、ECDH 等
  • 基于共享的 secret,常見有 PSK,SRP 等

(1) 方法 1:基于非對稱加密算法

維基百科對于非對稱加密算法的解釋:公開密鑰密碼學(英語:Public-key cryptography)也稱非對稱式密碼學(英語:Asymmetric cryptography)是密碼學的一種算法,它需要兩個密鑰,一個是公開密鑰,另一個是私有密鑰;一個用作加密,另一個則用作解密。使用其中一個密鑰把明文加密后所得的密文,只能用相對應的另一個密鑰才能解密得到原本的明文;甚至連最初用來加密的密鑰也不能用作解密。由于加密和解密需要兩個不同的密鑰,故被稱為非對稱加密;不同于加密和解密都使用同一個密鑰的對稱加密。雖然兩個密鑰在數學上相關,但如果知道了其中一個,并不能憑此計算出另外一個;因此其中一個可以公開,稱為公鑰,任意向外發布;不公開的密鑰為私鑰,必須由用戶自行嚴格秘密保管,絕不透過任何途徑向任何人提供,也不會透露給被信任的要通信的另一方。

非對稱加密 RSA 協商密鑰的辦法,是 HTTPS(嚴格說是 SSL/TLS 協議)最早的辦法,其過程如下:

  • 客戶端給服務端發送請求;
  • 服務端返回客戶端自己的公鑰 PuK;
  • 客戶端產生本次對話的對稱密鑰 SK,并用 PuK 進行加密得到 SK_Enc 后傳給服務端;
  • 服務端收到 SK_Enc 后用自己的私鑰 PrK 解密得到 SK;若成功,則返回客戶端 OK,否則終止對話.
  • 接下來,客戶端和服務端的對話均用 SK 加密后傳輸。

(2) 方法 2:基于專用密鑰交換算法

方法 1 是被大部分人熟知的,但是存在一個問題:如果服務端的私鑰 PrK 泄露了,那么 HTTPS 所做的加密也就不安全了。

因此,就有了密鑰交換算法(有說法是 keyless 方法)。方法原理筆者沒有深究(數學功底有限,看到大量的公式證明還是會煩…),DH 和 ECDH 協商密鑰算法大致過程如下:

ECDH 算法中的 A 和 B,在有的材料中也被稱為PreMaster-Secret。最終協商得到的密鑰 SK 也被稱為Master Secret,也被稱為Session Key。

直接給出結論:ECDH 比 DH 算法更快,有說法是 10 倍;而且 ECDH 比 DH 更難破解,可行性更好。

(3) 方法 3:基于共享的 secret

這類做法就是在客戶端和服務端預設好對稱加密密鑰,握手階段只需要傳遞類似鑰匙 id 即可。代表算法有 PSK。

問題 3:HTTPS 的有幾套非對稱加密?目的是什么?是否可以省略?

直接給出答案:2 套非對稱加密。

第一套用于協商對稱加密密鑰 SK(問題 2 一直在討論的內容);第二套用于數字證書簽名加密(接下來一章會詳細討論 CA 證書)。這兩者的區別是:前者是服務器端(如果是雙向驗證的話,客戶端也會有一套非對稱加密公私鑰)產生的。私鑰在服務端上;后者是 CA 機構產生的,私鑰在 CA 機構那邊。

并且,這 2 套都不可以省略。(這個說法略不嚴謹,但是在實際操作中,確實都不建議省略。)

三、身份驗證:HTTPS 的證書

筆者認為,對大部分程序員來說,工作中遇到的 HTTPS 相關問題,80%~90%都是跟證書相關的。因此,了解證書非常關鍵!

1. 證書是什么?

解釋這個問題之前,先看幾個關鍵詞:CA,CA 機構,數字證書,數字簽名,(證書)指紋,(CA)證書,HTTPS 證書,SSL/TLS 證書。

理一理上面這些關鍵詞之間的關系:

  • CA,CA 機構:機構/組織概念。
  • 數字證書,(CA)證書,HTTPS 證書,SSL/TLS 證書:CA 簽發的數字證書。
  • 數字簽名,(證書)指紋:CA 簽發的證書的內容之一,一段加密的密文。

智庫百科對數字證書的解釋是:

數字證書也稱公開密鑰證書,是指用于電子信息活動中電子文件行為主體的驗證和證明,并可實現電子文件保密性和完整性的電子數據。數字證書是一個經證書認證中心(Certification Authority,簡稱 CA)發行的文件。

數字證書包含有行為主體信息和證書認證機構的數字簽名。數字簽名是指以電子形式存在,可依附在電子文件中用于辨識電子文件的簽署者及表示對該電子文件內容負責所使用的電子數字標識。

抓重點:數字證書用于主體身份驗證。

首先,數字證書=主體信息+數字簽名。

Windows 下,我們可以在 Chrome 瀏覽器上點擊地址欄的“鎖”標記后會出現下拉框,接著點擊“證書”即可看到通過 HTTPS 訪問該服務器時的數字證書。具體操作如下:

  • 證書“常規”頁面,是關于該證書的一個籠統介紹,包括簽發該證書的 CA 機構、該證書綁定的域名(頒發給)、證書有效期。
  • 證書“詳細信息”頁面,以鍵值對形式展示了這張證書的完整內容。(后文將詳細介紹證書內容)
  • 證書的“證書路徑”,以層級結構展示了從該證書綁定的域名一直到根證書的路徑,這就是證書鏈。(后文會展開介紹證書鏈)

看完了 Chrome 瀏覽器上的證書,在讓我們通過 Wireshark 抓包來來看看數字證書:

對比 Chrome 上看到的數字證書和 Wireshark 抓包得到的數字證書,可以看到兩者呈現的證書內容是一致的。總結來看,一張完整的數字證書包括:

  • 主體的必要信息:版本(version)、序列號(serialNumber)、簽名算法(signatureAlgorithm)、頒發者(issuer)、有效期(validity)、使用者(subject)、公鑰信息(subjectPublicKeyInfo)
  • 主體的擴展信息(extension):如密鑰標識符、證書策略等
  • 數字簽名(signature),也稱指紋

抽象為下圖:

2.  為什么是數字證書呢?

HTTPS 已經對通信數據進行了加密,為什么還要驗證身份?說好的“人與人之間最基本的信任呢?”

這還不是因為各路黑客、駭客們總是在制造各種攻擊嗎?(捂臉)其中一個大名鼎鼎的中間人攻擊(Man-In-The-Middle Attack,MITM 攻擊),簡單的講,“中間人”在客戶端和服務端都不知情的情況下,夾在雙方之間竊聽甚至篡改通信信息,過程見下圖(圖引自《HTTPS 中間人攻擊實踐(原理·實踐)》):

在 HTTPS 的握手階段,一端向對端發送請求,對端返回自己的公鑰;而一端未驗證對方的身份和公鑰,直接協商密鑰。“中間人”看到了這個漏洞,夾在中間截獲了對端的公鑰,替換成了自己的公鑰。正是這步“拿錯了公鑰”或者說“信錯了對端”,使得 HTTPS 為加密(密鑰協商的非對稱加密和通信數據的對稱加密)所做的努力全部泡湯。

可見,在 HTTPS 中,“確保對端身份正確”即“確保拿到的公鑰正確”,而在網絡通信中所謂的“身份”,一般指的是通信一端的域名、IP 地址甚至是Mac 地址。所以,數字證書同時包含了通信一端的身份信息和公鑰信息。

但是數字證書會在網絡中傳輸(由被要求驗證身份的一端通過網絡傳給另一端),這就意味著證書也可能會被竊取篡改。這個時候權威的 CA 機構就出馬了,他想了個辦法:加了一個“防偽標識”— 數字簽名。具體做法如下:

  1. signature = RSA(PriKey_CA, Hash(message)) 

這里啰嗦幾句:數字簽名生成過程是首先對原文作哈希,把一段不定長的文本映射成固定長度的字符空間,接著再用 CA 機構的私鑰對這段定長字符做加密。大大提高了整體的運算效率。

3. 證書是怎么工作的?

要了解證書是怎么做“身份驗證”,即“防冒充”,得從 2 個角度來說明:

  • 申請證書,即需要被驗證身份的一端,需要申請一份能夠驗證自己身份的證書
  • 驗證證書,即需要驗證對方身份的一端,拿到證書后驗證對端的身份

請注意,這里有一個前提:這張證書必須是由權威 CA 機構頒發的,且尚在有效期內;或者是一張信任的私人證書。

(1) 申請證書

CA 機構和證書的分類本文不討論,這里我們討論正規權威 CA 機構簽發的證書,至于是 DV、OV 還是 EV,只是安全強度問題,工作原理是一樣的。

總結申請證書的過程:用戶向 CA 機構提交自己的信息(如域名)和公鑰(用戶自己生成的非對稱加密公鑰,用于 TLS 握手階段和另一端協商密鑰用),CA 機構生成數字證書,如下圖:

(2) 驗證證書

收到對端發過來的證書,執行證書申請的“逆過程”即可,總結如下圖:

接受證書的一端先對除數簽名的其他部分做一次相同的哈希算法(證書中指明了哈希算法),得到這段文本的哈希映射,記作 H1;獲取 CA 機構的公鑰對數字簽名屬性做解碼,得到了 CA 機構計算出的哈希映射,記作 H2。對比 H1 和 H2 兩個字符串是否嚴格相等,若是,代表該證書的信息未被篡改,證書有效;否則,證書內容被篡改,證書無效。

若證書有效,接受端會再進行對端的身份校驗(驗證域名),若身份驗證通過,接收端會拿證書上的公鑰(也是對端自己生產的非對稱加密公鑰)加密接下來整個 TLS 握手階段的信息之后,發送給對端。

這個過程中有一個問題:CA 機構的公鑰怎么獲取?

回答:提前內置。

眾所周知,操作系統和瀏覽器在軟件安裝階段會在其特定目錄下放置一堆的證書。如 Windows 的根證書管理在 certmgr 下:

這些證書都有個特點:權威 CA 機構發布的根證書(Root Certificate)。根證書有幾個特點:

  • 沒有上層機構再為其本身作數字簽名
  • 證書上的公鑰即為 CA 機構發布的公鑰
  • 權威 CA 機構的自簽證書

而這些根證書會跟很多軟件,包括操作系統、瀏覽器一起被安裝到用戶設備上。即使沒有被提前安裝好,這些根證書也可以在 CA 機構的官網上獲取得到。

目前全球大型權威 CA 機構有 Symantec、GeoTrust、Comodo 以及 RapidSSL 等,并且這些機構頒發的 SSL 數字證書,在市場的占有率是非常的高。(節選自《SSL 證書頒發機構有哪些》)

本地被內置了這么多的根證書,那要怎么知道我這份證書應該要用哪一個根證書來驗證呢?

回答:證書信任鏈。

在信任鏈上有 3 類證書:根證書,中介證書和用戶證書。根證書前文已有說明,用戶證書就是對端發過來的證書,或者說是用戶向權威 CA 機構綁定了自己身份(主要指域名)和自己公鑰的證書。中介證書可以理解由權威 CA 機構委派的代理機構簽發的數字證書,推薦閱讀《What is an intermediate certificate?》。中介證書或者說是中介機構的存在是為了保證根證書的密鑰的安全性。

細心的同學仔細看一看 certmgr 會發現有一個分類是“中間證書頒發機構”,這里存放的就是中介證書。用戶證書絕大多數是通過權威的 CA 機構的代理中介機構頒發。

這么來說,根據對端發來的用戶證書尋找對應的根證書豈不是更困難了?

自問自答:這是一個在樹形數據結構中,從葉子節點搜索根節點的過程,直接一個最原始的深搜(DFS)不就可以了嘛?舉例說明,如下圖(引自Wikipedia-Chain of trust):

  • 從用戶證書開始。
  • 記“Issuer”字段的值為 i1,搜索本地證書,尋找由“Subject”為 i1 的證書。
  • 若沒有找到,結束返回證書無效;否則,跳到步驟 4)。
  • 判斷該證書的 Issuer 值是否等于 Subject 值。
  • 若是,則該證書是根證書,結束返回該證書;否則跳到步驟 6)。
  • 以該證書開始,跳轉 2)(繼續搜索)。

更多關于信任鏈的知識點,推薦閱讀《What is the SSL Certificate Chain?》

4. 證書怎么樣?

相信不少同學或多或少接觸過證書文件,比如.pem、.crt、.cer、.key 等,于是問題就來了:

“為什么有這么多不同后綴名的證書啊?他們有什么聯系和區別?”

回答這個問題要從 3 個層面來分析:

  • 證書標準
  • 證書編碼格式
  • 文件擴展名

(1) 證書標準

數字證書的格式普遍采用的是 X.509 國際標準,維基百科對于 X.509 解釋如下:

X.509 是密碼學里公鑰證書的格式標準。X.509 證書已應用在包括 TLS/SSL 在內的眾多網絡協議里,同時它也用在很多非在線應用場景里,比如電子簽名服務。X.509 證書里含有公鑰、身份信息(比如網絡主機名,組織的名稱或個體名稱等)和簽名信息(可以是證書簽發機構 CA 的簽名,也可以是自簽名)。對于一份經由可信的證書簽發機構簽名或者可以通過其它方式驗證的證書,證書的擁有者就可以用證書及相應的私鑰來創建安全的通信,對文檔進行數字簽名。

X.509 是 ITU-T 標準化部門基于他們之前的 ASN.1 定義的一套證書標準。

(2) 證書的編碼格式

X.509 標準的證書文件具有不同的編碼格式:PEM 和 DER。

  • PEM:

PEM,全稱 Privacy Enhanced Mail,以文本格式存儲,以 -----BEGIN

XXX-----開頭、-----END XXX-----結尾,中間內容是 BASE64 編碼數據。其文本內容大概如下:

  1. html -----BEGIN CERTIFICATE----- Base64編碼過的證書數據 -----END CERTIFICATE----- 

通常,PEM 格式可以存儲公鑰、私鑰、證書簽名請求等數據。查看 PEM 格式證書的信息一般采用如下命令:

  1. openssl x509 -in xxx.pem -text -noout 

Apache 和 Nginx 服務器偏向于使用這種編碼格式。

  • DER:

DER,全稱 Distinguished Encoding Rules,以二進制存儲,因此文件結構無法直接預覽,只能通過如下命令查看:

  1. html openssl x509 -in xxx.der -inform der -text -noout 

DER 格式也可以存儲公鑰、私鑰、證書簽名請求等數據。Java 和 Windows 應用偏向于使用這種編碼格式。

當然同一 X.509 證書的不同編碼之間可以互相轉換:

  • PEM 轉為 DER:
    1. openssl x509 -in xxx.pem -outform der -out xxx.der 
  • DER 轉為 PEM:
    1. openssl x509 -in xxx.der -inform der -outform pem -out xxx.pem 

(3) 文件擴展名

不同的擴展名可以分為以下幾類:

  • 證書:存放數字證書,X.509 標準,格式可能是 PEM 或 DER。.crt、.cer
  • 密鑰:用來存放一個 RSA 公鑰或私鑰,這類文件不是 X.509 標準,但是是 PEM 或 DER 格式。后綴名有.key。
  • 證書+密鑰:可同時存放證書和 RSA 公鑰/.pem、.der、.p12
  • 證書請求:并不是證書,而是證書簽名請求。csr

四、完整性校驗:HTTPS 的哈希

哈希,鍵值對數據結構,通過哈希函數把一個空間映射到另一個空間。非常好用的一個工具,而且哪哪兒都有它的影子,比如負載均衡的一致性哈希、密碼學中用于信息加密或數據校驗的各種哈希(SHA、MD5 等)、二維空間定位的 GeoHash、對象相似度的 SimHash 等等。

HTTPS 的的哈希一共用在 2 個地方:

1. 證書的數字簽名

具體做法在上文證書一章節已經說過,不再贅述。在這里使用哈希的目的主要是為了減少非對稱加密算法 RSA 在長文本上的開銷。

2. 對稱加密的 Message Digest

在數據通信階段,SSL/TLS 會對原始消息(message)做一次哈希,得到該消息 message 的摘要,稱為消息摘要(Message Digest)。對端接受到消息后,使用協商出來的對稱加密密鑰解密數據包,得到原始消息 message;接著也做一次相同的哈希算法得到摘要,對比發送過來的消息摘要和計算出的消息摘要是否一致,可以判斷通信數據是否被篡改。

五、HTTPS 通信流程

到此,HTTPS 涉及到的關鍵問題基本都覆蓋了。本章總結整個 HTTPS 的通信過程:

補充說明幾點:

1. 協商密鑰:客戶端/服務端隨機數、Client/Server Key

在加密一章節介紹的 ECDH 是停留在原理層面,實際中密鑰協商除了 PreMaster-Secret(即 Client/Server Key)之外,還有客戶端和服務端隨機數參與,參考文章《Https:TLS 握手協議》,引用文中的圖來自展示實際 ECDH 秘鑰協商的做法:

 

2. Change Cipher Spec

Change Cipher Spec是通知對方需要加密參數。文章《TLSde 改變密碼標準協議(Change Cipher Spec Protocol)》指出:

SSL 修改密文協議的設計目的是為了保障 SSL 傳輸過程的安全性,因為 SSL 協議要求客戶端或服務器端每隔一段時間必須改變其加解密參數。當某一方要改變其加解密參數時,就發送一個簡單的消息通知對方下一個要傳送的數據將采用新的加解密參數,也就是要求對方改變原來的安全參數。

SSL 修改密文協議是使用 SSL 記錄協議服務的 SSL 高層協議的 3 個特定協議之一,也是其中最簡單的一個。協議由單個消息組成,該消息只包含一個值為 1 的單個字節。該消息的唯一作用就是使未決狀態復制為當前狀態,更新用于當前連接的密碼組。為了保障 SSL 傳輸過程的安全性,雙方應該每隔一段時間改變加密規范。

3. Encrypted Handshake Message

Encrypted Handshake Message作用就是確認協商出來的對稱加密密鑰 SK 的正確性,在客戶端和服務端協商得到對稱加密密鑰 SK 之后,互相給對方發了一條用 SK 加密的消息,如果這個加密的消息被解密校驗成功,那么就說明對稱加密密鑰 SK 是正確的。

4. 單向驗證和雙向驗證

本章全部所探討的案例都是基于單向驗證,即客戶端向服務端請求證書、驗證服務端身份。在一些實際場景中,對安全性的要求更高,有服務端要求驗證客戶端的身份,即雙向驗證。雙向驗證在單向驗證基礎上,增加“在服務端發送證書之后,向客戶端發送‘請求證書’請求,接著驗證客戶端身份”這個步驟。參考下圖(圖片出處不查):

六、HTTPS 實戰問題記錄

1. 問題:HTTPS 是否需要做域名劫持?

沒必要。

原因如下:https 在證書校驗這步,客戶端除了通過對比數字簽名來校驗證書的有效性,還會比較證書上的域名是否與自己要訪問的域名一致。因此,只要服務器的證書是可信的且客戶端不跳過“證書驗證”這個步驟,https 能夠防止域名劫持。

筆者在實際中做過防止域名劫持的工作,具體做法是:首先,客戶端向可信賴的域名服務器請求域名對應的 IP 地址;接著,客戶端用 IP 替換域名進行網絡請求。被稱為HTTPS 的 IP 直連。但在實際中會遇到了一個問題:域名身份不對。根本解決方案是:1).書校驗時,選擇自己定義的 hostname 進行校驗;2).證書校驗前,把 URL 的 IP 替換回域名。在很多語言實現中,解決方案更為簡單:在請求頭部的增加 host-name 字段,值填入域名即可。

2. 問題:"x509: certificate signed by unknown authority"

這個問題是客戶端拿到了服務器的證書要進行身份驗證,但是通過證書信任鏈策略發現中間斷了,搜索不到根證書。說白了就是客戶端本地沒有簽發這個用戶證書的根證書或中介證書。

實際中的解決辦法有:1). 缺啥裝啥,沒有根證書/中介證書,那就安裝上;2).跳過證書身份驗證這步。GoLang 中跳過身份驗證的實現:

  1. client := &http.Client{ 
  2.     Transport: &http.Transport{ 
  3.         TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, 
  4.     } 

3. 問題:https 項目中,服務端怎么管理證書和 RSA 密鑰?

看情況。

如果是正規的公司,一般會有統一的接入層幫忙做掉,后臺開發程序員只需要關心自己的業務邏輯即可。運維同事或者是負責接入層開發的同事們會定期更新證書,負責幫忙做 HTTPS 的 RSA 管理。而且這些證書都是由正規權威 CA 機構簽發的,普遍的客戶端設備上都預置了對應的根證書。

如果是個人,一般沒有條件負擔 HTTPS 證書費用,因此可以選擇自己簽發自簽證書,或者到免費的證書簽發機構申請證書。但是這類證書要求在客戶端上同步安裝對應的根證書。

4. 問題:https 項目中,客戶端的根證書要提前安裝嗎?

上一個問題中已經提到了:

  • 如果是正規權威 CA 機構簽發的證書,一般不需要提前安裝;
  • 如果是私人簽發的證書,需要提前安裝。

但是,筆者在邊緣計算設備上開發時發現,比如攝像頭這類的“tinny os”上,是一個“閹割”版本的 Linux 系統,因此沒有安裝任何根證書。在這類設備上做 https 通信,一定需要提前安裝根證書才行。

責任編輯:趙寧寧 來源: 騰訊技術工程
相關推薦

2014-04-17 16:42:03

DevOps

2022-07-26 00:00:22

HTAP系統數據庫

2021-11-09 09:48:13

Logging python模塊

2021-01-15 07:44:21

SQL注入攻擊黑客

2023-03-16 10:49:55

2014-11-28 10:31:07

Hybrid APP

2019-09-16 08:40:42

2012-05-31 09:56:54

云安全

2022-12-12 08:46:11

2022-03-14 07:53:27

ELTETL大數據

2015-07-31 10:35:18

實時計算

2019-11-06 09:52:01

JavaScript單線程非阻塞

2017-10-18 22:01:12

2023-10-24 08:53:24

FutureTas并發編程

2025-01-03 08:09:15

2024-02-02 08:50:20

Node.js元數據自動化

2023-11-01 13:48:00

反射java

2022-06-29 10:21:33

3d打印輔助工具

2021-11-26 08:07:16

MySQL SQL 語句數據庫

2016-11-02 12:06:27

分布式系統大數據
點贊
收藏

51CTO技術棧公眾號

日韩在线观看电影完整版高清免费| 日韩在线视频观看| 国产免费黄色一级片| 性欧美videos另类hd| 韩日在线一区| 精品在线观看国产| www.xxx亚洲| 黄色在线免费网站| 久久99精品久久久久久国产越南 | 九九视频直播综合网| 男插女视频网站| av岛国在线| 久久精品男人的天堂| 日本aⅴ大伊香蕉精品视频| 黄色免费一级视频| 日本在线一区二区三区| 亚洲影视在线播放| 免费久久久一本精品久久区| 中文字幕在线播放av| 欧美日韩一区二区高清| 精品少妇一区二区三区| 日韩伦理在线免费观看| 国产资源在线观看| 国产成人在线视频网站| 欧美一级成年大片在线观看| 很污很黄的网站| 国产精品高潮呻吟久久久久| 在线视频国产一区| 国产女人18毛片| 日本视频在线观看一区二区三区| 狠狠v欧美v日韩v亚洲ⅴ| 3344国产精品免费看| 潘金莲一级黄色片| 深爱激情久久| 欧美成人国产一区二区| 亚洲成人天堂网| 国产中文在线播放| 亚洲美女一区二区三区| 欧美在线视频一区二区三区| 亚洲国产一二三区| 美女一区二区三区在线观看| 97久久国产精品| 亚洲二区在线播放| 国产综合久久久| 亚洲韩国日本中文字幕| 99视频在线观看视频| 欧美xxx视频| 亚洲国产精品一区二区www| 亚洲激情图片| 免费福利在线观看| 99免费精品视频| av成人免费观看| 97人妻精品一区二区三区软件| 裸体一区二区| 欧美中文字幕精品| 毛片视频网站在线观看| 欧美午夜久久| 久久视频精品在线| 手机免费观看av| 国产一区二区三区91| 日韩精品在线网站| 日韩精品国产一区| 欧美另类中文字幕| 欧美丰满美乳xxx高潮www| 好男人www社区| 成人va天堂| 色天使久久综合网天天| 青青视频在线播放| 小早川怜子影音先锋在线观看| 亚洲国产精品天堂| 日韩精品综合在线| 波多野结衣久久| 亚洲一区二区欧美激情| 欧美精品在欧美一区二区| 少女频道在线观看免费播放电视剧| 1000精品久久久久久久久| 一区二区三区偷拍| 女女色综合影院| 亚洲美女屁股眼交| wwwjizzjizzcom| 91高清在线观看视频| 国产精品国产三级国产有无不卡| 水蜜桃亚洲精品| 理论视频在线| 国产日韩欧美a| 欧美成熟毛茸茸复古| 四虎国产精品永远| 久久蜜臀精品av| 亚洲高清在线观看一区| 日本亚洲精品| 亚洲精品成a人| 大伊香蕉精品视频在线| 一个人看的www视频在线免费观看| 欧美色videos| 亚洲少妇第一页| 国产aⅴ精品一区二区四区| 日韩欧美一区二区三区在线| 国产人成视频在线观看| 亚洲自拍电影| 色阁综合伊人av| 在线观看成人毛片| 午夜在线播放视频欧美| 午夜精品一区二区三区在线视| 亚洲国产成人精品激情在线| 久久久青草婷婷精品综合日韩| 国产成人久久久| 一本色道久久综合精品婷婷| 国产呦精品一区二区三区网站| 成人自拍爱视频| 天堂√在线中文官网在线| 中文av一区特黄| 国产精品视频一二三四区| 在线观看男女av免费网址| 欧美日韩免费看| 久久国产激情视频| 久久综合社区| 日韩三级影视基地| 亚洲国产成人精品激情在线| 美女久久久精品| 国产精品二区在线观看| 国产一级片在线| 一区二区三区在线观看欧美| 日本成年人网址| 精品久久国产一区| 亚洲情综合五月天| 日韩黄色免费观看| 老司机午夜精品视频在线观看| 亚洲一区二区三区香蕉| 欧美日韩国产综合视频 | 亚洲第一福利视频在线| 另类小说第一页| 国产精品sss在线观看av| 日韩亚洲成人av在线| 九九热在线免费观看| 国产一区在线观看麻豆| 欧美在线日韩精品| 1024在线看片你懂得| 欧美日韩精品欧美日韩精品| 先锋资源av在线| 欧美精品国产一区二区| 国产精品自产拍在线观| 人成在线免费视频| 亚洲永久精品大片| 永久免费的av网站| 精品久久久久中文字幕小说| 国语自产精品视频在线看一大j8 | 色综合久久网| 日本欧美精品在线| 深爱激情五月婷婷| 一区二区成人在线视频| 国产女同无遮挡互慰高潮91| 精品久久影院| 欧亚精品在线观看| 特黄aaaaaaaaa真人毛片| 一区二区三区四区国产精品| 污版视频在线观看| 特黄特色欧美大片| 91精品国产91久久久久| 国模人体一区二区| 一区二区三区在线观看动漫 | 日韩欧美看国产| 亚洲国产精品视频在线观看| 久久久久亚洲AV成人| 国产一区二区三区国产| 在线码字幕一区| 热久久久久久| 综合欧美国产视频二区| 极品国产91在线网站| 国产三级久久久| 熟妇人妻va精品中文字幕 | 欧美电影影音先锋| 麻豆精品国产免费| 国产在线一区观看| 免费观看国产视频在线| 在线观看亚洲精品福利片| 中文字幕一区二区三区电影| 一区二区视频在线免费观看| 国产精品欧美经典| 中文字幕亚洲影院| 欧美三级第一页| 国产伦精品一区二区三区免费视频| 日韩av中文| 欧美性受xxxx| www欧美com| 顶级嫩模精品视频在线看| 黄色www网站| 欧美精选视频在线观看| 国产日韩av在线播放| 麻豆tv免费在线观看| 欧美一级在线观看| 日本天堂在线视频| 91视频国产资源| 99热自拍偷拍| 欧美欧美黄在线二区| 国产免费亚洲高清| 日本欧美电影在线观看| 亚洲国产欧美一区| 午夜精品一区二| 国产精品国产a| 麻豆网站免费观看| 亚洲福利精品| 欧洲一区二区在线| 国产视频网站一区二区三区| 国外成人在线视频| 国产一级免费在线观看| 欧美美女视频在线观看| 国产亚洲精品码| 久久久99精品免费观看| 亚洲一区二区在线视频观看| 亚洲调教视频在线观看| 日本免费高清一区二区| 麻豆久久久久| 午夜精品久久久久久久白皮肤 | 久久久久久激情| 国产欧美日韩三区| 男人添女人荫蒂国产| 久久久久.com| 日韩极品视频在线观看| 九九亚洲视频| 国产精品v欧美精品∨日韩| 免费观看一级欧美片| 久热精品视频在线观看一区| 天堂资源最新在线| 欧美一区三区四区| 免费看毛片网站| 国产精品欧美一区二区三区| 色哟哟无码精品一区二区三区| 日韩电影免费在线观看网站| 免费人成自慰网站| 99久久激情| 欧美一区1区三区3区公司 | 第一福利永久视频精品| 久久免费看少妇高潮v片特黄| 久久精品欧美一区二区三区不卡| 人妻少妇偷人精品久久久任期| 久久综合中文| 777777av| 狠狠爱www人成狠狠爱综合网| 亚洲一区二区精品在线观看| 伊人成综合网伊人222| 国产精品国色综合久久| 国产乱码精品一区二区三区亚洲人 | 久久人人看视频| 操你啦视频在线| 日韩中文第一页| 国产在线免费观看| 亚洲精品视频免费| 亚洲av无码国产精品永久一区| 欧美三级电影在线观看| 黄色免费av网站| 亚洲综合丁香婷婷六月香| 欧美三级黄色大片| 中文字幕日本不卡| 日韩欧美视频免费观看| 欧美激情一二三区| 91精品国自产在线| 国产天堂亚洲国产碰碰| 久久无码人妻精品一区二区三区| 国产91精品在线观看| 亚洲欧美日韩一二三区| 韩国三级中文字幕hd久久精品| 日本www.色| 美女在线一区二区| 亚洲精品无码久久久久久| 亚洲一本视频| 久久国产午夜精品理论片最新版本| 欧美私人啪啪vps| 国产玉足脚交久久欧美| 黄色成人在线网站| 婷婷五月综合缴情在线视频| 一区久久精品| 午夜精品久久久久久久无码| 一区在线免费| 欧美一级在线看| 老色鬼久久亚洲一区二区| 亚洲精品中文字幕无码蜜桃| 久久精品导航| 向日葵污视频在线观看| 国产一区视频在线看| 妖精视频在线观看| av日韩在线网站| 免费黄色在线视频| 欧美国产精品一区二区三区| 国产jizz18女人高潮| 亚洲人成在线播放网站岛国| 欧美日韩国产一二三区| 亚洲视频狠狠干| 久久久久久久极品内射| 精品久久久久久| 免费黄色片视频| 欧美日本在线视频| 亚洲精品喷潮一区二区三区 | 国外av在线| 国产三级精品视频| 91av手机在线| 亚洲三级电影全部在线观看高清| 一级黄色录像视频| 亚洲综合一区在线| 国产精品国产精品88| 午夜视频在线观看一区二区| 日本一二三区不卡| 91久久精品日日躁夜夜躁欧美| 日本三级理论片| 香蕉乱码成人久久天堂爱免费| 免费污污视频在线观看| www.亚洲色图.com| 欧美高清视频在线| 青青草精品在线| 久久久综合网| 天天做天天干天天操| 不卡免费追剧大全电视剧网站| 亚洲中文字幕无码av| 国产精品国产三级国产普通话三级 | 日韩中文av在线| 国产精品探花在线| 国产精品美女网站| 在线播放一区二区精品视频| 欧美主播一区二区三区美女 久久精品人 | 在线一区欧美| 伊人影院综合在线| 成人a区在线观看| 呻吟揉丰满对白91乃国产区| 亚洲夂夂婷婷色拍ww47| 最近中文字幕在线观看| 欧美sm极限捆绑bd| 国产视频网站在线| 色综合色综合久久综合频道88| 制服丝袜专区在线| 91嫩草国产在线观看| 欧美女王vk| 欧美三级在线观看视频| 久久99蜜桃精品| a天堂中文字幕| 亚洲成人7777| 欧美性猛交xxxx乱大交hd| 欧美一区日韩一区| 成人在线观看网站| 2019最新中文字幕| 欧美日韩黄色| 在线视频福利一区| 日韩一区精品视频| 亚洲最大免费视频| 亚洲男女一区二区三区| 日韩精品在线观看免费| 欧美xxxxxxxx| 污片视频在线免费观看| 欧洲中文字幕国产精品| 国产成人高清精品免费5388| 糖心vlog在线免费观看| 精品一区二区免费看| 国产精久久一区二区三区| 欧美日韩激情视频| 人妻偷人精品一区二区三区| 欧美极品第一页| 欧美成人精品一区二区综合免费| 成人午夜精品在线| 色欲狠狠躁天天躁无码中文字幕| 午夜精品福利一区二区蜜股av | 欧美巨乳美女视频| 99精品女人在线观看免费视频| 亚洲高清在线观看一区| 久久电影网站中文字幕| 黄色a级片在线观看| 日韩一区二区在线播放| 亚洲小说区图片| 国产精品国产一区二区| 先锋影音国产一区| b站大片免费直播| 欧美日韩另类一区| 亚洲精品白浆| 精品国产一区二区三区四区精华| 免费在线亚洲欧美| 性の欲びの女javhd| 9191成人精品久久| 高清在线视频不卡| 亚洲 国产 日韩 综合一区| 九九热在线视频观看这里只有精品| 国产性生活大片| 亚洲大胆人体av| 亚洲天堂1区| 欧美一级黄色录像片| 不卡区在线中文字幕| 午夜精品一区二| 欧美成人久久久| 日日天天久久| 欧美国产日韩在线视频| 天天综合网 天天综合色| 国产高清av在线| 亚洲精品欧美日韩专区| 国产亚洲综合精品| 性欧美疯狂猛交69hd| 亚洲精品综合精品自拍| 国产精品视频一区二区三区| 欧美黄网站在线观看| 亚洲欧洲成人av每日更新| 天天操天天干天天| 国产在线观看一区二区三区| 亚洲精选91| 久热这里有精品| 亚洲一级片在线看|