HTTPS基礎原理和設定-2

2023-02-14 12:02:00

〇、概述

作為概述,以下是本文要講的內容。HTTPS 是什麼? 每個人都可能從瀏覽器上認出 HTTPS,並對它有好感。然後再講一遍基礎知識,再詳細講一下協定版本,密碼套件(Cipher Suites),本文的重點會落在如何設定 NGINX,讓你的網站使用 HTTPS 服務。

除此之外,還有一個使用 HTTPS 作為代理的問題; 所以,如果你的 NGINX 在另一個應用程式的前面,你如何設定NGINX 作為 HTTPS 使用者端。

在這裡,我會介紹一些方法,用以檢查你的 HTTPS 設定,以看到它是最安全的和最新的,以及一些額外主題,幫助你得到你需要的 A+ 級別的安全。

本文涉及以下內容:

  1. 什麼是 HTTPS
  2. 協定版本
  3. 密碼套件
  4. 證書

下一篇的內容將包括:

  1. 設定 NGINX
  2. 後端 HTTPS
  3. 檢查設定
  4. 設定 HSTS
  5. OCSP Stapling

一、什麼是 HTTPS

你可能猜到了,HTTPS 就是 HTTPS, S 代表安全(Security)。就網路而言,有兩種協定,分別叫做 SSL 和 TLS。它們可以互換使用。但是,「安全協定」(a security protocol)是位於通訊之上的安全層。如果你想一下OSI 七層網路模型,那麼它位於第 7 層的下面即第 6 層,叫做表示層。

在使用者端和伺服器之間,它向您提供的是資料的保密性。因此,所有從使用者端傳送到伺服器的資訊都是完全加密的,所以只有兩個人知道如何讀取資訊,那就是使用者端和伺服器。它還提供了一種形式的身份驗證,在這種身份驗證中,客戶機可以知道伺服器到底是誰。這些都交織在握手(handshake)的概念中。

1.1 SSL 握手 (Diffie‑Hellman)

  1. 使用者端:使用者端傳送 hello、使用者端隨機(client random)和受支援的密碼套件(cipher suites)給伺服器;
  2. 第二步
    1. 2a:伺服器傳送伺服器隨機(server random)和公鑰證書(public key certificate)(也會傳送一個用於對談複用的session ID)給使用者端。
    2. 2b:使用者端隨機、伺服器隨機和公鑰證書的金鑰簽名。
  3. 伺服器傳送伺服器 DH (Diffie‑Hellman) 引數和金鑰簽名(signature)給使用者端。
  4. 使用者端傳送使用者端 DH 引數給伺服器。
  5. 使用者端和伺服器都從伺服器 DH 引數和使用者端 DH 引數中獲得相同的 premaster secret。
  6. 使用者端和伺服器都從使用者端隨機、伺服器隨機和 premaster secret 中獲得相同的對談金鑰(session keys)。使用者端可以從伺服器請求內容,並且請求將被加密。(也傳送了對談複用的對談票據(session ticket))

上圖是 SSL/TLS 握手流程。這有點複雜; 有很多可移動的部分,但本質上,如果你退一步看,它是在使用者端和傳送加密資訊的伺服器之間額外的一到兩次往返。在這種情況下,你有幾個選項——有伺服器隨機,有使用者端隨機; 這些都是你不需要知道的深奧的東西。

您只需要知道伺服器本身傳送一個公鑰,使用者端和伺服器建立一個共用 secret,它們可以使用這個 secret 來加密通訊。因此,存取者和伺服器之間的所有通訊都使用對稱金鑰加密,這意味著雙方都有相同的金鑰。還有一個完整性金鑰,在本例中是 HMAC,但我暫時先跳過這個圖,轉而討論更重要的問題: 「為什麼需要設定HTTPS?」

1.2 為什麼需要設定 HTTPS

  • 使用者隱私
  • SEO 加成
  • 放在「沒有 HTTPS 能力的服務」的前面
  • 通用最佳實踐

主要原因是使用者隱私。在服務通訊的情況下,這是資訊的隱私 - 你有多信任你正在使用的傳輸資訊的網路? 你相信這些網路不會向你的流量中注入資訊,並且能夠讀取傳輸的資訊嗎? 另外 2015 年之後,如果你在你的網站上使用 https,它提供了一個搜尋引擎優化的優勢,谷歌排名(以及國內的百度)將會比那些不支援 HTTPS 的網站排名更高。

另一件你可以為 HTTPS 做的事情(這是 NGINX 的主要用例之一)是把它放在那些不支援 HTTPS 或不支援最現代、最新版本的 SSL 和 TLS 的服務前面。因此,你可以從 NGINX 得到的是所有加密演演算法的最好、最先進的實現,你不需要真的去思考 HTTPS 的複雜性,總的來說,這是一個很好的實踐。

另外,如果有人去存取一個網站,他們喜歡看到那個快樂的小鎖圖示。在本例中是 nginx.com,它啟用了 HTTPS 和 HSTS (我將在後面討論這個特性)。你不能再使用普通的 HTTP 版本存取了; 瀏覽器知道總是使用 HTTPS。你在這裡看到的另一件事是,有一個漂亮的 NGINX, Inc[US] 顯示這是一個擴充套件驗證證書 —— 本質上,這個證書表明NGINX 是哪家公司的。他們為此多付了一點錢,做了一些調查並在證書上展示出來。

1.3 HTTPS 帶來的缺點有哪些?

  • 操作運維的複雜性
  • 額外的延遲(首次連線多了 2 次往返)
  • CPU 消耗

但 HTTPS 不是十全十美; 也有一些缺點。具體來說,有一點操作運維上的複雜性。你必須管理證書,你必須確保它們持續更新。您需要有受信任的管理員來儲存私鑰資料。

當你通過 HTTPS 連線到一個網站時,第一次可能會慢一些; 如果您的物理距離不一定很近,那麼除了 TCP 握手之外,還有 SSL 握手,正如我提到的,它至少增加了兩次往返。因此,延遲會受到輕微的影響,但這可以通過 SSL 的一些更高階的特性(如 SPDY 和 HTTP/2 )來緩解,本文不會詳細介紹這些特性。

最終 HTTPS 可以和 HTTP 一樣快,但有時不是。你的伺服器上也有加密的成本; 這是一個很長時間不使用 HTTPS 的原因,但它越來越不適用。最新一代英特爾伺服器可以非常快速地完成 HTTPS 所需的加密,而且幾乎沒有成本。所以,在現代硬體中,加密傳輸中的資料基本上是免費的。

1.4 你需要為 HTTPS 做哪些事情?

  • 支援的一系列 SSL/TLS 協定
  • 傾向使用的一系列的密碼套件
  • 由受信任的證書機構(CA)簽名的私鑰和證書

如果你想為你的服務或網站設定 HTTPS,你需要做一些選擇並獲得一些東西。第一個「決定」是您想要支援的協定,第二個「決定」是您想要支援的密碼(後面將詳細說明這意味著什麼),還有「您需要獲得」證書和相應的私鑰。這是一個重要的部分,由客戶信任的第三方證書頒發機構「頒發」。我稍後會講到,但首先讓我們談談協定版本(protocol versions)。

二、協定版本(Protocol Versions)

回顧一下前文,HTTPS 是 HTTP 加上 S,S一直在變化; 它是隨著時間而進化的。最初,SSL v1.0 是 Netscape(網景) 發明的協定。有一個著名的軼事是,馬克·安德森(Marc Andreessen)在麻省理工學院做演講時觀眾席上有人用鉛筆描述瞭如何破解密碼演演算法。

所以,SSL TLS 加密協定其實並沒有很長的歷史,1995 年 網景 釋出了 SSL v2.0,這也是 web 加密的開始。這使得電子商務領域,人們可以線上提交密碼和信用卡,並且至少是相當安全的。

2.1 HTTPS 歷史背景

接下來請參見加密協定歷史概要 - HTTPS 基礎原理和設定 - 1 - 東風微鳴技術部落格 (ewhisper.cn)