傳輸層安全 (TLS) 配置

傳輸層安全 (TLS) 確保所有通訊的機密性、真實性和完整性,因此應將其用於所有入站和出站網站通訊。

TLS 配置

問題

如果透過 Web 傳送未加密的資料,它可能會被第三方攔截,從而使他們能夠訪問和修改資料 — 這通常被稱為 中間人攻擊 (MiTM)。MiTM 攻擊會對您的系統安全造成嚴重後果。

因此,所有請求和響應都應透過 HTTPS 傳送,HTTPS 使用 TLS 來加密資料。現代 Web 幾乎強制執行此要求 — 所有瀏覽器都正朝著預設要求 HTTPS 的方向發展,並且許多 Web 功能只能在 安全上下文 中使用。

解決方案

您應該設定伺服器軟體以使用安全的配置,強制使用帶有安全 TLS 設定的 HTTPS。有幾種 TLS 配置生成器可供使用,例如 Mozilla 的 SSL 配置生成器。此工具提供了基於 Mozilla TLS 指南 的幾個選項。

資源載入

問題

所有資源,無論其來源如何,都應透過安全通道載入。

安全 (HTTPS) 網站嘗試透過不安全連線 (HTTP) 載入活動資源 (如 JavaScript) 將被瀏覽器阻止。因此,使用者將遇到 UI 降級和 混合內容 警告。例如,在下面的程式碼中,不正確地使用 HTTP 來載入 JavaScript 庫

html
<script src="http://code.jquery.com/jquery-1.12.0.min.js"></script>

同樣,嘗試不安全地載入影像等被動內容,雖然風險較低,但仍會導致 UI 降級和混合內容警告,並可能允許活動攻擊者篡改網站或進行使用者網路釣魚。例如

html
<img src="http://very.badssl.com/image.jpg" />

儘管現代瀏覽器會清楚地標明網站何時不安全地載入資源,但這些錯誤仍然在 Web 上頻繁發生。

解決方案

在部署之前,請驗證所有資源是否都透過 HTTPS 載入。

示例

在此示例中,正在正確使用 HTTPS 來載入 JavaScript 庫

html
<script src="https://code.jquery.com/jquery-1.12.0.min.js"></script>

HTTP 重定向

問題

網站可能繼續監聽埠 80 (HTTP) 以防止使用者在位址列中鍵入 URL 時出現連線錯誤,因為初始瀏覽器連線通常是透過 HTTP 進行的。在首次連線到站點時,這會帶來初始安全風險,因為該連線不受 TLS 保護。

此外,站點應避免從一個主機的 HTTP 重定向到另一個主機的 HTTPS,因為這會阻止為第一個主機設定 Strict-Transport-Security(請參閱 HTTP 嚴格傳輸安全)。

解決方案

監聽埠 80 的站點應僅重定向到 HTTPS 上的相同資源。一旦發生重定向,Strict-Transport-Security 應確保將來所有透過 HTTP 訪問站點的嘗試都自動重定向到安全站點。

不打算公開訪問的 API 或網站應完全停用 HTTP 的使用。

修復“不同主機”問題

  1. 首先,將 http://example.com/ 重定向到 https://example.com/。
  2. 接下來,將 https://example.com/ 重定向到 https://example.org/。

示例

使用 NGINX 將所有入站 HTTP 請求重定向到同一站點和 URI 的 HTTPS 版本

nginx
server {
  listen 80;

  return 301 https://$host$request_uri;
}

使用 Apache 將 site.example.org 從 HTTP 重定向到 HTTPS

apacheconf
<VirtualHost *:80>
  ServerName site.example.org
  Redirect permanent / https://site.example.org/
</VirtualHost>

HTTP 嚴格傳輸安全實現

問題

為了防止 中間人攻擊 (MiTM),瀏覽器應僅透過 HTTPS 連線到站點。

解決方案

HTTP Strict-Transport-Security (HSTS) 是一個 HTTP 標頭,它通知瀏覽器僅透過 HTTPS 連線到給定站點,即使最初指定的方案是 HTTP。為給定站點設定了 HSTS 的瀏覽器將自動將該站點上的所有請求升級為 HTTPS。HSTS 還透過停用繞過證書錯誤頁面的功能,指示瀏覽器更嚴格地處理 TLS 和證書相關的錯誤。

Strict-Transport-Security 支援以下指令

max-age

設定瀏覽器將重定向到 HTTPS 的持續時間(以秒為單位)。

includeSubDomains 可選

指定瀏覽器是否應將所有子域上的請求升級到 HTTPS。例如,在 domain.example.com 上設定 includeSubDomains 將確保對 host1.domain.example.comhost2.domain.example.com 的請求除了 domain.example.com 本身之外也會被升級。

preload 可選

指定是否應預載入該站點。包含此指令意味著您的站點可以包含在 HSTS 預載入列表 中。

請遵循以下步驟正確地在您的網站上實現 HSTS

  1. max-age 值設定為至少六個月 (15768000)。建議設定更長的時間,例如兩年 (63072000)。設定此值後,站點必須在到期時間到達之前繼續支援 HTTPS。
  2. 如果可能,設定 includeSubDomains 以提高所有子域的安全性。設定此指令時需要仔細測試,因為它可能會停用尚未啟用 HTTPS 的子域上的站點。
  3. 如果可能,設定 preload 以便將您的網站包含在 HSTS 預載入列表中。要將其新增到列表中,請訪問 https://hstspreload.org/,然後在頁面頂部的表單中輸入您的站點 URL,並修復它提到的任何問題。Web 瀏覽器將在收到初始 Strict-Transport-Security 標頭之前,對預載入的站點執行 HTTPS 升級。這可以防止首次使用時發生 降級攻擊,並且推薦用於所有高風險網站。請注意,包含在 HSTS 預載入列表中還需要設定 includeSubDomains,並將 max-age 設定為至少 1 年 (31536000)。

除了 Strict-Transport-Security 之外,您還應在您的 Content-Security-Policy 中設定 upgrade-insecure-requests 指令。這指示瀏覽器將站點上的所有不安全 URL (透過 HTTP 提供的 URL) 視為透過 HTTPS 提供。upgrade-insecure-requests 旨在用於擁有大量需要重寫的舊不安全 URL 的網站。

示例

建議透過 HTTPS 連線站點兩年

http
Strict-Transport-Security: max-age=63072000

如果可能,另外升級子域請求到 HTTPS,並將站點包含在預載入列表中

http
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload

同時設定 upgrade-insecure-requests CSP

http
Content-Security-Policy: upgrade-insecure-requests;

另見