<-
Apache > HTTP 伺服器 > 文件 > 2.4 版 > 模組

Apache 模組 mod_tls

可用語言:  en 

描述透過 rustls 資源庫使用記憶體安全 Rust 程式碼實現的 TLS v1.2 和 v1.3
狀態實驗性
模組識別碼tls_module
原始檔mod_tls.c
相容性在 2.4.52 版以上可用

摘要

mod_tls 是 mod_ssl 的替代方案,可提供 https 給伺服器。它是一項子集功能,在下方會詳細說明。它可用於作為 mod_ssl 的同伴,例如:可同時載入這兩個模組。

mod_tls 使用 C 所寫,使用名為 rustls 的 TLS Rust 實作,透過其 C 介面 rustls-ffi。這可提供具有相近效能的記憶體安全密碼處理和協定處理。

它可以設定用於前端和後端連線。組態指令已盡可能保持與 mod_ssl 雷同。

Support Apache!

主題

指令

錯誤修正清單

相關資訊

top

TLS 在 VirtualHost 內容中

Listen 443
TLSEngine 443

<VirtualHost *:443>
  ServerName example.net
  TLSCertificate file_with_certificate.pem file_with_key.pem
  ...
</VirtualHost>

上面是最小的組態。不是在每個虛擬主機中啟用 mod_tls,而是指定進入 TLS 連線的埠。

您無法在相同埠上混合使用具備 mod_ssl 和 mod_tls 的虛擬主機。只能擇一。支援 SNI 和 ALPN。您可以在相同埠上使用許多虛擬主機,並混合使用 http/1.1 和 h2 等多種協定。

top

與 mod_ssl 的功能比較

下表比較 mod_ssl 和 mod_tls 之間的功能。如果這裡未列出 mod_ssl 的功能,表示 mod_tls 不支援。一個差異,而且可能是最相關的一個,就是 mod_tls 的目前版本缺少對客戶端憑證的支援。

功能mod_sslmod_tls備註
前端 TLS
後端 TLS
TLS v1.3是**) 使用較新的 OpenSSL
TLS v1.2
TLS v1.0是**) 如果已在 OpenSSL 中啟用
SNI 虛擬主機
客戶端憑證
後端的機器憑證
OCSP Stapling是**) 透過 mod_md
後端 OCSP 檢查否**) 將驗證釘選
允許的 TLS 版本最小 - 最大最小
TLS 加密獨佔清單偏好/抑制
TLS 加密順序客戶端/伺服器客戶端/伺服器
TLS 會話
SNI 嚴格性預設否預設是
選項環境變數詳盡有限**) 請參閱變數清單
選項 ExportCertData客戶端 + 伺服器伺服器
後端 CA檔案/目錄檔案
吊銷 CRL
TLS 重新協商是**) 在 TLS v1.2 中
加密的憑證金鑰

top

TLS 協定

mod_tls 支援 TLS 協定版本 1.2 和 1.3。如果日後有版本 1.4,且 rustls 支援,也會提供。

在 mod_tls 中,您組態要使用的最小版本,永不用組態最大值

TLSProtocol TLSv1.3+

這允許僅版本 1.3,以及可能成為後繼版本與您的伺服器或某個特定虛擬主機交談。

top

TLS 加密

rustls 函式庫支援的 TLS cipher 的清單中,可以 在此處 找到。所有 TLS v1.3 cipher 都受支援。對於 TLS v1.2,只有 rustls 視為安全的 cipher 可用。

mod_tls 支援 TLS cipher 的下列名稱

  1. IANA 指派的 使用 `_` 來區分部分的名稱。範例:TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  2. OpenSSL 名稱,使用 `-` 作為分隔符號 (針對 1.2)。範例:ECDHE-ECDSA-AES256-SHA384。此類名稱經常顯示於文件說明中。`mod_tls` 為所有 TLS v1.2 cipher 定義這些名稱。對於 TLS v1.3 cipher,也會支援以 `TLS13_` 開頭的名稱。
  3. IANA 指派的識別碼是一個 16 位元數值。範例:0xc024。您可以在設定檔中以 TLS_CIPHER_0xc024 的方式使用這項值。

您可以設定 cipher 的偏好,表示這些 cipher 會用於支援其的客戶端。如果您未設定偏好,rustls 會使用它視為最佳的偏好。此方法是建議的做法。

如果您仍需要偏好一個 cipher 超過另一個 cipher,您可以使用以下方式設定

TLSCiphersPrefer ECDHE-ECDSA-AES256-SHA384
# or several
TLSCiphersPrefer ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305

如果您指定一名稱不明的 cipher,設定將會失敗。如果您指定的名稱未獲得 rustls 支援 (或因安全考量而不再獲得更新版本 rustls 支援),mod_tls 會記錄一則 警告,但會繼續運作。

如果您想停用特定 cipher,有一個類似的機制

TLSCipherSuppress ECDHE-ECDSA-AES256-SHA384

已壓制的 cipher 將不再使用。如果您指定一名稱不明的 cipher,設定將會失敗。如果您指定的名稱未獲得 rustls 支援 (或因安全考量而不再獲得更新版本 rustls 支援),mod_tls 會記錄一則 警告,但會繼續運作。

top

虛擬主機

mod_tls 使用 SNI (伺服器名稱指示) 從符合所服務埠的已設定虛擬主機中選擇一個。如果客戶端未提供 SNI,將會選取設定中的**第一個**虛擬主機。如果客戶端**確實**提供 SNI (就像今日所有客戶端都會做的一樣),就**必須符合**一個虛擬主機 (伺服器名稱伺服器別名);否則,連接將會失敗。

就像 mod_ssl 一樣,您可以替基本伺服器 (全域) 和/或透過 SNI 由客戶端選取的個體虛擬主機指定 cipher 和協定版本。

Listen 443
TLSEngine 443

<VirtualHost *:443>
  ServerName example1.net
  TLSCertificate example1-cert.pem
  ...
</VirtualHost>

<VirtualHost *:443>
  ServerName example2.net
  TLSCertificate example2-cert.pem
  ...
  TLSProtocol v1.3+
</VirtualHost>

以上範例顯示了在同一個埠上的虛擬主機的不同 TLS 設定。此方式受到支援。可以透過所有的 TLS 版本與 example1 聯繫,而 example2 只允許 v1.3 或後續版本。

top

ACME 憑證

ACME 憑證透過 mod_md 支援,就像 mod_ssl 一樣。基本設定

Listen 443
TLSEngine 443
MDomain example.net

<VirtualHost *:443>
  ServerName example.net
  ...
</VirtualHost>
top

OCSP Stapling

mod_tls 自身沒有實作來擷取證書的 OCSP 資訊。但是,如果 mod_md 提供的話,它會將這種資訊用於釘選。請參閱 mod_md 的文件,了解如何啟用此功能。

top

TLS 變數

透過指令 TLSOptions,已將多個變數放入要求環境中,並可在其中進行檢查,例如在 CGI 腳本中。

變數名稱由 mod_ssl 提供。請注意,這些僅是 mod_ssl 公開的多個變數的子集。

變數TLSOption描述
SSL_TLS_SNI*由客戶端傳送的伺服器名稱指標 (SNI)
SSL_PROTOCOL*協商的 TLS 協定
SSL_CIPHER*協商的 TLS 密碼名稱
SSL_VERSION_INTERFACEStdEnvVars模組版本
SSL_VERSION_LIBRARYStdEnvVarsrustls-ffi 版本
SSL_SECURE_RENEGStdEnvVars總是為 `false`
SSL_COMPRESS_METHODStdEnvVars總是為 `false`
SSL_CIPHER_EXPORTStdEnvVars總是為 `false`
SSL_CLIENT_VERIFYStdEnvVars總是為 `false`
SSL_SESSION_RESUMEDStdEnvVars如果客戶端提供已知的 TLS 會話識別碼,則為 `Resumed`,否則為 `Initial`
SSL_SERVER_CERTExportCertDataPEM 格式的選取伺服器證書

變數 SSL_SESSION_ID 故意不支援,因為它包含敏感資訊。

top

客戶端憑證

儘管原則上 rustls 支援客戶端證書,但沒有提供在伺服器中使用此證書的基礎架構部分。

這些功能包括:吊銷清單、證書延伸檢視以及 OCSP 驗證的匹配發行者鏈。沒有這些功能,便無法吊銷客戶端證書。提供沒有吊銷的驗證並非考量選項。

這項工作將繼續進行,而客戶端證書支援也可能於未來版本中提供。

top

TLSCertificate 指令

描述將證書和金鑰 (PEM 編碼) 加入伺服器/虛擬主機。
語法TLSCertificate cert_file [key_file]
內容伺服器設定、虛擬主機
狀態實驗性
模組mod_tls

如果您未指定個別金鑰檔,則假設金鑰也位於第一個檔案中。您可以將多個證書加入伺服器/虛擬主機。之後,便會選取最適合客戶端的第一個證書。

路徑可以根據伺服器根目錄指定相對路徑。

top

TLSCiphersPrefer 指令

描述定義優先順序較高的密碼。
語法TLSCiphersPrefer cipher(-list)
內容伺服器設定、虛擬主機
狀態實驗性
模組mod_tls

這不會停用 `rustls` 支援的任何密碼。如果您指定一個完全未知的密碼,設定便會失敗。如果您指定一個 `rustls` 已知但未支援的密碼,將會記錄警告,但伺服器會繼續執行。

範例

TLSCiphersPrefer ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305

範例優先提供 2 個密碼,其順序為提及順序。

top

TLSCiphersSuppress 指令

描述定義不使用的加密法。
語法TLSCiphersSuppress cipher(-list)
內容伺服器設定、虛擬主機
狀態實驗性
模組mod_tls

這不會停用 `rustls` 支援的任何未提及的加密法。如果你指定一個完全未知的加密法,組態就會失敗。如果你指定一個已知 `rustls` 支援的加密法,會記錄一個警告,但伺服器會繼續執行。

範例

TLSCiphersSuppress ECDHE-ECDSA-CHACHA20-POLY1305

範例移除一個加密法,不用於連線。

top

TLSEngine 指令

描述定義模組要在哪個位址和連接埠,處理接收連線。
語法TLSEngine [address:]port
內容伺服器組態
狀態實驗性
模組mod_tls

這是在全域層級設定的,而不是在個別

範例

TLSEngine 443

範例告知 mod_tls 在所有監聽器的連接埠 443 處理接收連線。

top

TLSHonorClientOrder 指令

描述確定是否要尊重客戶端支援的加密法順序
語法TLSHonorClientOrder on|off
預設值TLSHonorClientOrder on
內容伺服器設定、虛擬主機
狀態實驗性
模組mod_tls

TLSHonorClientOrder 確定是否要尊重客戶端支援的加密法順序。

top

TLSOptions 指令

描述啟用要求的 SSL 變數。
語法TLSOptions [+|-]option
內容伺服器組態、虛擬主機、目錄、.htaccess
狀態實驗性
模組mod_tls

TLSOptionsSSLOptionsmod_ssl 中類似。它可以分別設定目錄/位置,`option` 可以為:

  • `StdEnvVars`:新增更多變數到要求環境中,例如轉發至 CGI 處理和其他應用程式。
  • `ExportCertData`:新增與憑證相關的變數到要求環境中。
  • `Defaults`:重設所有選項為其預設值。

將變數新增到要求環境需要額外的作業負載,特別是需要檢查憑證和擷取欄位時。因此,大部分的變數預設是不設定的。

你可以為不同位置或一般於伺服器/虛擬主機上組態 TLSOptions。在選項之前加上 `-`,可以停用這個選項而不影響其他選項。`+` 前綴與沒有前綴一樣。

`Defaults` 值可 used to reset any options that are inherited from other locations or the virtual host/server.

範例

<Location /myplace/app>
  TLSOptions Defaults StdEnvVars
  ...
</Location>
top

TLSProtocol 指令

描述指定 TLS 協定的最低版本。
語法TLSProtocol version+
預設值TLSProtocol v1.2+
內容伺服器設定、虛擬主機
狀態實驗性
模組mod_tls

預設為 `v1.2+`。將其設定為 `v1.3+` 會停用 TLSv1.2。

top

TLSProxyCA 指令

描述設定用於驗證後端伺服器的根憑證。
語法TLSProxyCA file.pem
內容伺服器設定、虛擬主機、代理區段
狀態實驗性
模組mod_tls

top

TLSProxyCiphersPrefer 指令

描述定義代理連線中偏好的加密演算法。
語法TLSProxyCiphersPrefer cipher(-list)
內容伺服器設定、虛擬主機、代理區段
狀態實驗性
模組mod_tls

這不會停用 `rustls` 支援的任何密碼。如果您指定一個完全未知的密碼,設定便會失敗。如果您指定一個 `rustls` 已知但未支援的密碼,將會記錄警告,但伺服器會繼續執行。

top

TLSProxyCiphersSuppress 指令

描述定義不可在代理連線中使用的加密演算法。
語法TLSProxyCiphersSuppress cipher(-list)
內容伺服器設定、虛擬主機、代理區段
狀態實驗性
模組mod_tls

這不會停用 `rustls` 支援的任何未提及的加密法。如果你指定一個完全未知的加密法,組態就會失敗。如果你指定一個已知 `rustls` 支援的加密法,會記錄一個警告,但伺服器會繼續執行。

top

TLSProxyEngine 指令

描述啟用後端連線的 TLS。
語法TLSProxyEngine on|off
內容伺服器設定、虛擬主機、代理區段
狀態實驗性
模組mod_tls

TLSProxyEngine 類似於 SSLProxyEngine 中的 mod_ssl

這可以用於伺服器/虛擬主機或 <Proxy> 區段中,以啟用模組使用 mod_proxy 進行傳出連線。

top

TLSProxyMachineCertificate 指令

描述新增憑證和金鑰檔案(PEM 編碼)至代理設定。
語法TLSProxyMachineCertificate cert_file [key_file]
內容伺服器設定、虛擬主機、代理區段
狀態實驗性
模組mod_tls

憑證用於驗證代理的後端伺服器。

如果您未指定獨立的金鑰檔案,則假設金鑰也存在於第一個檔案。您可以新增多個憑證至代理設定。然後由 rustls 選擇適用於與後端建立代理連線的第一個憑證。

路徑可以根據伺服器根目錄指定相對路徑。

top

TLSProxyProtocol 指令

描述指定在代理連線中使用的最小 TLS 協定版本。
語法TLSProxyProtocol version+
預設值TLSProxyProtocol v1.2+
內容伺服器設定、虛擬主機、代理區段
狀態實驗性
模組mod_tls

預設為 `v1.2+`。將其設定為 `v1.3+` 會停用 TLSv1.2。

top

TLSSessionCache 指令

描述指定 TLS 會話恢復快取。
語法TLSSessionCache cache-spec
內容伺服器組態
狀態實驗性
模組mod_tls

這會在伺服器端使用快取,讓客戶端得以恢復連線。

您可以將其設定為 `none`,或定義快取,如同 SSLSessionCache 指令中的 mod_ssl

若未設定,mod_tls 將嘗試自行建立共用的記憶體快取,使用 `shmcb:tls/session-cache` 作為規範。如果失敗,系統會記錄警告,但伺服器將會繼續執行。

top

TLSStrictSNI 指令

描述強制用戶端伺服器指示器 (SNI) 與主機名稱的確切匹配。
語法TLSStrictSNI on|off
預設值TLSStrictSNI on
內容伺服器組態
狀態實驗性
模組mod_tls

如果找不到匹配,使用 SNI 的用戶端連線會失敗。

可用語言:  en 

top

留言

注意
這裡不是問與答的部分。放在這裡的留言應著重在建議如何改進文件或伺服器,如果留言已實現或被認為無效/離題,我們的管理員可能會將其移除。關於如何管理 Apache HTTP Server 的問題應指向我們的 IRC 頻道,即 Libera.chat 上的 #httpd,或寄至我們的郵件列表