精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产嫩草在线视频| 日韩特级黄色片| 亚洲欧洲二区| 日韩美女视频一区| 动漫一区二区在线| 特黄视频免费看| 日韩成人精品一区| 欧美大片拔萝卜| 中文字幕乱码人妻综合二区三区| 在线视频自拍| 成人av午夜电影| 国产精国产精品| 破处女黄色一级片| 真实原创一区二区影院| 欧美一区二区三区人| 阿v天堂2017| 在线视频1区2区| 99在线视频精品| 成人春色激情网| 黄色片中文字幕| 欧美日韩综合| 最近2019年日本中文免费字幕| 亚洲AV成人精品| 日本另类视频| 婷婷开心激情综合| 超薄肉色丝袜足j调教99| 国产三级在线| 不卡的av网站| 亚洲自拍偷拍一区| 中文字幕日日夜夜| 每日更新成人在线视频| 欧美精品免费播放| 多男操一女视频| 蜜臀久久99精品久久一区二区| 欧美一级片免费看| 久热精品在线播放| 久久99久久99精品免观看软件| 一区二区三区精品在线观看| 亚洲一二区在线| 三级视频网站在线| 成人美女在线视频| 91精品黄色| 夜夜躁很很躁日日躁麻豆| 久久亚洲一区| 91精品成人久久| 国产在线视频你懂的| 亚洲国产老妈| 日韩中文字幕在线观看| 国产123在线| 久久99国产精一区二区三区| 亚洲欧美日本精品| 国产精品亚洲无码| 视频一区中文| 日韩精品久久久久久福利| 午夜男人的天堂| 91亚洲无吗| 精品三级在线看| 深夜视频在线观看| 国产一区二区三区国产精品| 7777精品久久久大香线蕉| 亚洲欧美日韩综合网| 777午夜精品电影免费看| 日本乱人伦aⅴ精品| 精品久久久久av| 成人四虎影院| 欧美日韩高清一区二区三区| 中文字幕22页| 精品久久国产一区| 欧美成人a在线| 亚洲av永久无码精品| 欧美美女黄色| 亚洲欧美精品一区二区| 亚洲精品成人无码| 日韩一区三区| 久久久国产成人精品| 欧美黑吊大战白妞| 日韩午夜av在线| 青青久久aⅴ北条麻妃| 波多野结衣高清在线| 麻豆精品在线播放| av一区二区三区在线观看| 内射后入在线观看一区| 337p粉嫩大胆噜噜噜噜噜91av| 免费影院在线观看一区| 在线国产情侣| 亚洲制服丝袜av| 91黄色小网站| 日韩专区视频| 欧美mv日韩mv| 90岁老太婆乱淫| 天天天综合网| 91av视频在线免费观看| 中文字幕一区二区三区四区免费看 | 国产日韩在线播放| www三级免费| 久久精品亚洲乱码伦伦中文| 一区二区三区不卡在线| 久久免费电影| 欧美在线影院一区二区| 四虎国产精品免费| 视频一区在线观看| 欧美激情乱人伦一区| 国产一卡二卡三卡| 国产成人综合在线| 天天综合色天天综合色hd| 成人在线网址| 色综合久久精品| 香蕉视频1024| 日本激情一区| 91禁外国网站| a级片在线视频| www激情久久| 欧美日韩中文字幕在线播放| 亚洲成av在线| 精品国产免费一区二区三区四区| 亚洲一级片在线播放| 99在线精品视频在线观看 | 一区三区自拍| 一区二区三区四区精品| 国产一级片久久| 精品一区二区在线视频| 欧美尤物一区| 久久久男人天堂| 日韩欧美一区在线| 日本在线观看网址| 天堂午夜影视日韩欧美一区二区| 国产精品av一区| 午夜在线播放| 在线观看国产91| 182在线视频| 国产精品啊啊啊| 成人天堂噜噜噜| www.av在线| 91精品福利视频| 91精品国产自产| 日韩午夜免费| 国产伦视频一区二区三区| 成人免费看片| 91精品国产综合久久久久| 国产在视频线精品视频| 青草av.久久免费一区| 欧美日本国产精品| 黄色在线看片| 日韩欧美色综合| 老妇女50岁三级| 精品一区二区三区香蕉蜜桃| 亚洲欧美日韩精品久久久 | www.桃色.com| 欧美国产偷国产精品三区| 国产精品免费久久久久影院| 韩国免费在线视频| 色噜噜夜夜夜综合网| 亚洲人人夜夜澡人人爽| 久久国产精品久久w女人spa| 久久婷婷人人澡人人喊人人爽| xxxx另类黑人| 亚洲精品久久久一区二区三区| www.av视频在线观看| 成人av第一页| 成人免费观看视频在线观看| 亚洲日本三级| 国产精品va在线播放| 电影av一区| 欧美日韩国产一级片| 国产三级aaa| 经典一区二区三区| 男女爱爱视频网站| 中文在线综合| 97在线免费视频| 桃花色综合影院| 亚洲精品乱码| 粉嫩精品一区二区三区在线观看| 久久久123| 日韩精品视频免费专区在线播放| 久久久久久久久久成人| 国产亚洲精品免费| 色18美女社区| 黄色亚洲精品| 日本一区网站| 免费精品一区| 5566日本婷婷色中文字幕97| 国产高清视频在线| 在线成人免费视频| 日韩伦人妻无码| 久久精品免费在线观看| 亚洲三级视频网站| 亚洲色图欧美| 久久99精品久久久久久秒播放器| 亚洲a∨精品一区二区三区导航| 日韩在线视频国产| 亚洲精品免费在线观看视频| 欧美性色xo影院| 男人av资源站| 99re亚洲国产精品| 国产三级日本三级在线播放| 中文字幕免费一区二区三区| 国产在线一区二区三区播放| 成人综合网站| 色综合视频一区中文字幕| 日本成人一区| 日韩午夜精品视频| 蜜臀精品一区二区三区| 亚洲免费成人av| 韩国无码一区二区三区精品| 看片网站欧美日韩| 99热自拍偷拍| 91精品天堂福利在线观看 | 国产a久久精品一区二区三区| 国产日本欧美一区二区三区| 超碰在线网站| xxx一区二区| 日韩精品系列| 日韩欧美国产三级| 一级特黄aaa| 欧美日韩加勒比精品一区| 卡通动漫亚洲综合| 久久精品夜夜夜夜久久| 韩国av中国字幕| 久久国产精品区| 国产裸体免费无遮挡| 最新亚洲激情| 日本三级中文字幕在线观看| 国产一区二区三区四区五区传媒| 成人av免费在线看| 95精品视频| 国产精品久久中文| 最新av在线免费观看| 国产黄色在线网站| 亚洲欧美日韩精品| 欧美一区二区公司| 欧美一二三四区在线| 最新中文字幕第一页| 大伊人狠狠躁夜夜躁av一区| 久草免费在线视频观看| 亚洲欧美怡红院| 在线免费观看视频| 久久青草欧美一区二区三区| 亚洲日本久久久| 国产高清无密码一区二区三区| 欧美三级理论片| 久久久777| 日韩欧美精品在线观看视频| 日韩亚洲在线| av在线观看地址| 亚洲一级网站| 无码av天堂一区二区三区| 午夜国产精品视频免费体验区| 黄色一级片网址| 五月婷婷六月综合| youjizz.com亚洲| 国产精品国内免费一区二区三区| 在线一区高清| 99久久亚洲精品蜜臀| 9999在线观看| 欧美韩日精品| 性一交一乱一伧国产女士spa| 亚洲最新色图| 轻点好疼好大好爽视频| 国内精品福利| 国产精品裸体瑜伽视频| 亚洲狠狠婷婷| 天天摸天天碰天天添| 日韩电影在线免费观看| 91国产精品视频在线观看| 美腿丝袜亚洲一区| 午夜啪啪小视频| 青青久久av| 欧美日韩中文字幕| 欧美极品aaaaabbbbb| 一区二区三区欧美激情| 国产在线视频二区| 欧美视频在线观看 亚洲欧| 黄色污污网站在线观看| 欧美日韩亚洲综合一区| 国产女人高潮毛片| 精品伦理精品一区| 偷拍自拍在线| 一区二区三区国产在线观看| 久操视频在线免费播放| 欧美激情videos| 涩涩视频在线免费看| 国产精品极品尤物在线观看| 最新亚洲国产| 国产日韩久久| 第一社区sis001原创亚洲| 中国老女人av| 中文一区在线| 亚洲黄色小视频在线观看| 国产精品原创巨作av| 国产精品无码在线| 国产精品久久久久久久久久免费看| 日本中文在线视频| 午夜日韩在线观看| 中文字幕理论片| 日韩欧美在线一区二区三区| 天堂网www中文在线| 色婷婷av一区二区三区久久| 爱情岛亚洲播放路线| 国产精品黄色影片导航在线观看| 伊人精品综合| 午夜午夜精品一区二区三区文| 国产精品hd| 国产免费视频传媒| va亚洲va日韩不卡在线观看| 欧美88888| 欧美日韩激情美女| 性猛交xxxx乱大交孕妇印度| 亚洲热线99精品视频| 美足av综合网| 国产欧美va欧美va香蕉在线| 欧美激情极品| 秋霞在线一区二区| 久久在线91| www.啪啪.com| 亚洲九九爱视频| 欧美男人天堂网| 日韩成人免费视频| 色av手机在线| 成人天堂噜噜噜| 狠狠做六月爱婷婷综合aⅴ| 久草视频国产在线| 国产麻豆成人传媒免费观看| 精品亚洲aⅴ无码一区二区三区| 亚洲午夜久久久久久久久电影网 | 国产h在线观看| 久久久久久12| 日韩精品亚洲专区在线观看| 亚洲一区二区三区精品视频| 玖玖视频精品| 日本黄色特级片| 亚洲高清免费视频| www.com在线观看| 久久久97精品| 日韩成人一区| 五月天亚洲综合小说网| 日韩国产欧美在线观看| 欧美bbbbb性bbbbb视频| 亚洲成人在线观看视频| 亚洲国产综合网| 欧美高跟鞋交xxxxhd| 亚洲午夜精品| 国产乱人伦精品一区二区三区| 狠狠色狠狠色综合系列| 99精品中文字幕| 欧美精品九九99久久| 幼a在线观看| 国产欧美精品一区二区三区-老狼| 国产区精品区| 国产v亚洲v天堂无码久久久| 久久久久九九视频| 波多野结衣黄色| 中文字幕日韩精品在线| 久久电影天堂| 艳母动漫在线免费观看| 国产一区日韩二区欧美三区| 国产稀缺精品盗摄盗拍| 欧美变态口味重另类| av电影免费在线看| 久久www免费人成精品| 亚洲一区图片| 美国美女黄色片| 欧美日韩国产美| bestiality新另类大全| 99一区二区三区| 日韩五码在线| 久久久久久久久久久久久久久| 91豆麻精品91久久久久久| 在线日本中文字幕| 92看片淫黄大片欧美看国产片| 中文无码久久精品| 影音先锋人妻啪啪av资源网站| 色哟哟国产精品| 色综合久久影院| 成人自拍视频网站| 亚洲男女自偷自拍| 手机看片国产日韩| 精品国产一区二区三区忘忧草| sis001亚洲原创区| 欧美一区二区三区四区在线观看地址 | 亚洲国产另类久久精品 | 国产一级片在线播放| 国产精品一区二区三| 欧美一区二区三区久久精品茉莉花 | 欧美日韩在线视频免费| 亚洲激情免费观看| 韩国成人在线| 日本人妻伦在线中文字幕| 91免费视频网址| 在线观看黄色网| 欧美国产日韩二区| 国产一区二区欧美| 国产在线观看中文字幕| 欧美日韩一区二区在线播放| 三级外国片在线观看视频| 国产精品果冻传媒潘| 欧美aaa在线| 国产精品99精品| 爽爽爽爽爽爽爽成人免费观看| 粉嫩av一区二区| 一道本在线免费视频|