Apache HTTP 伺服器 2.4 版
可用語言: 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
雷同。
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 等多種協定。
下表比較 mod_ssl
和 mod_tls 之間的功能。如果這裡未列出 mod_ssl
的功能,表示 mod_tls 不支援。一個差異,而且可能是最相關的一個,就是 mod_tls 的目前版本缺少對客戶端憑證的支援。
功能 | mod_ssl | mod_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 中 |
加密的憑證金鑰 | 是 | 否 |
mod_tls 支援 TLS 協定版本 1.2 和 1.3。如果日後有版本 1.4,且 rustls
支援,也會提供。
在 mod_tls 中,您組態要使用的最小版本,永不用組態最大值
TLSProtocol TLSv1.3+
這允許僅版本 1.3,以及可能成為後繼版本與您的伺服器或某個特定虛擬主機交談。
在 rustls
函式庫支援的 TLS cipher 的清單中,可以 在此處 找到。所有 TLS v1.3 cipher 都受支援。對於 TLS v1.2,只有 rustls 視為安全的 cipher 可用。
mod_tls 支援 TLS cipher 的下列名稱
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
ECDHE-ECDSA-AES256-SHA384
。此類名稱經常顯示於文件說明中。`mod_tls` 為所有 TLS v1.2 cipher 定義這些名稱。對於 TLS v1.3 cipher,也會支援以 `TLS13_` 開頭的名稱。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 會記錄一則 警告
,但會繼續運作。
mod_tls 使用 SNI (伺服器名稱指示) 從符合所服務埠的已設定虛擬主機中選擇一個。如果客戶端未提供 SNI,將會選取設定中的**第一個**虛擬主機。如果客戶端**確實**提供 SNI (就像今日所有客戶端都會做的一樣),就**必須符合**一個虛擬主機 (伺服器名稱
或 伺服器別名
);否則,連接將會失敗。
就像
一樣,您可以替基本伺服器 (全域) 和/或透過 SNI 由客戶端選取的個體虛擬主機指定 cipher 和協定版本。mod_ssl
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 或後續版本。
ACME 憑證透過
支援,就像 mod_md
一樣。基本設定mod_ssl
Listen 443 TLSEngine 443 MDomain example.net <VirtualHost *:443> ServerName example.net ... </VirtualHost>
mod_tls 自身沒有實作來擷取證書的 OCSP 資訊。但是,如果 mod_md
提供的話,它會將這種資訊用於釘選。請參閱 mod_md
的文件,了解如何啟用此功能。
透過指令 TLSOptions
,已將多個變數放入要求環境中,並可在其中進行檢查,例如在 CGI 腳本中。
變數名稱由 mod_ssl
提供。請注意,這些僅是 mod_ssl
公開的多個變數的子集。
變數 | TLSOption | 描述 |
---|---|---|
SSL_TLS_SNI | * | 由客戶端傳送的伺服器名稱指標 (SNI) |
SSL_PROTOCOL | * | 協商的 TLS 協定 |
SSL_CIPHER | * | 協商的 TLS 密碼名稱 |
SSL_VERSION_INTERFACE | StdEnvVars | 模組版本 |
SSL_VERSION_LIBRARY | StdEnvVars | rustls-ffi 版本 |
SSL_SECURE_RENEG | StdEnvVars | 總是為 `false` |
SSL_COMPRESS_METHOD | StdEnvVars | 總是為 `false` |
SSL_CIPHER_EXPORT | StdEnvVars | 總是為 `false` |
SSL_CLIENT_VERIFY | StdEnvVars | 總是為 `false` |
SSL_SESSION_RESUMED | StdEnvVars | 如果客戶端提供已知的 TLS 會話識別碼,則為 `Resumed`,否則為 `Initial` |
SSL_SERVER_CERT | ExportCertData | PEM 格式的選取伺服器證書 |
變數 SSL_SESSION_ID
故意不支援,因為它包含敏感資訊。
儘管原則上 rustls
支援客戶端證書,但沒有提供在伺服器中使用此證書的基礎架構部分。
這些功能包括:吊銷清單、證書延伸檢視以及 OCSP 驗證的匹配發行者鏈。沒有這些功能,便無法吊銷客戶端證書。提供沒有吊銷的驗證並非考量選項。
這項工作將繼續進行,而客戶端證書支援也可能於未來版本中提供。
描述 | 將證書和金鑰 (PEM 編碼) 加入伺服器/虛擬主機。 |
---|---|
語法 | TLSCertificate cert_file [key_file] |
內容 | 伺服器設定、虛擬主機 |
狀態 | 實驗性 |
模組 | mod_tls |
如果您未指定個別金鑰檔,則假設金鑰也位於第一個檔案中。您可以將多個證書加入伺服器/虛擬主機。之後,便會選取最適合客戶端的第一個證書。
路徑可以根據伺服器根目錄指定相對路徑。
描述 | 定義優先順序較高的密碼。 |
---|---|
語法 | TLSCiphersPrefer cipher(-list) |
內容 | 伺服器設定、虛擬主機 |
狀態 | 實驗性 |
模組 | mod_tls |
這不會停用 `rustls` 支援的任何密碼。如果您指定一個完全未知的密碼,設定便會失敗。如果您指定一個 `rustls` 已知但未支援的密碼,將會記錄警告,但伺服器會繼續執行。
TLSCiphersPrefer ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305
範例優先提供 2 個密碼,其順序為提及順序。
描述 | 定義不使用的加密法。 |
---|---|
語法 | TLSCiphersSuppress cipher(-list) |
內容 | 伺服器設定、虛擬主機 |
狀態 | 實驗性 |
模組 | mod_tls |
這不會停用 `rustls` 支援的任何未提及的加密法。如果你指定一個完全未知的加密法,組態就會失敗。如果你指定一個已知 `rustls` 支援的加密法,會記錄一個警告,但伺服器會繼續執行。
TLSCiphersSuppress ECDHE-ECDSA-CHACHA20-POLY1305
範例移除一個加密法,不用於連線。
描述 | 定義模組要在哪個位址和連接埠,處理接收連線。 |
---|---|
語法 | TLSEngine [address:]port |
內容 | 伺服器組態 |
狀態 | 實驗性 |
模組 | mod_tls |
這是在全域層級設定的,而不是在個別
TLSEngine 443
範例告知 mod_tls 在所有監聽器的連接埠 443 處理接收連線。
描述 | 確定是否要尊重客戶端支援的加密法順序 |
---|---|
語法 | TLSHonorClientOrder on|off |
預設值 | TLSHonorClientOrder on |
內容 | 伺服器設定、虛擬主機 |
狀態 | 實驗性 |
模組 | mod_tls |
TLSHonorClientOrder
確定是否要尊重客戶端支援的加密法順序。
描述 | 啟用要求的 SSL 變數。 |
---|---|
語法 | TLSOptions [+|-]option |
內容 | 伺服器組態、虛擬主機、目錄、.htaccess |
狀態 | 實驗性 |
模組 | mod_tls |
TLSOptions
與 SSLOptions
在 mod_ssl
中類似。它可以分別設定目錄/位置,`option` 可以為:
將變數新增到要求環境需要額外的作業負載,特別是需要檢查憑證和擷取欄位時。因此,大部分的變數預設是不設定的。
你可以為不同位置或一般於伺服器/虛擬主機上組態 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>
描述 | 指定 TLS 協定的最低版本。 |
---|---|
語法 | TLSProtocol version+ |
預設值 | TLSProtocol v1.2+ |
內容 | 伺服器設定、虛擬主機 |
狀態 | 實驗性 |
模組 | mod_tls |
預設為 `v1.2+`。將其設定為 `v1.3+` 會停用 TLSv1.2。
描述 | 定義代理連線中偏好的加密演算法。 |
---|---|
語法 | TLSProxyCiphersPrefer cipher(-list) |
內容 | 伺服器設定、虛擬主機、代理區段 |
狀態 | 實驗性 |
模組 | mod_tls |
這不會停用 `rustls` 支援的任何密碼。如果您指定一個完全未知的密碼,設定便會失敗。如果您指定一個 `rustls` 已知但未支援的密碼,將會記錄警告,但伺服器會繼續執行。
描述 | 定義不可在代理連線中使用的加密演算法。 |
---|---|
語法 | TLSProxyCiphersSuppress cipher(-list) |
內容 | 伺服器設定、虛擬主機、代理區段 |
狀態 | 實驗性 |
模組 | mod_tls |
這不會停用 `rustls` 支援的任何未提及的加密法。如果你指定一個完全未知的加密法,組態就會失敗。如果你指定一個已知 `rustls` 支援的加密法,會記錄一個警告,但伺服器會繼續執行。
描述 | 啟用後端連線的 TLS。 |
---|---|
語法 | TLSProxyEngine on|off |
內容 | 伺服器設定、虛擬主機、代理區段 |
狀態 | 實驗性 |
模組 | mod_tls |
TLSProxyEngine
類似於 SSLProxyEngine
中的 mod_ssl
。
描述 | 新增憑證和金鑰檔案(PEM 編碼)至代理設定。 |
---|---|
語法 | TLSProxyMachineCertificate cert_file [key_file] |
內容 | 伺服器設定、虛擬主機、代理區段 |
狀態 | 實驗性 |
模組 | mod_tls |
憑證用於驗證代理的後端伺服器。
如果您未指定獨立的金鑰檔案,則假設金鑰也存在於第一個檔案。您可以新增多個憑證至代理設定。然後由 rustls
選擇適用於與後端建立代理連線的第一個憑證。
路徑可以根據伺服器根目錄指定相對路徑。
描述 | 指定在代理連線中使用的最小 TLS 協定版本。 |
---|---|
語法 | TLSProxyProtocol version+ |
預設值 | TLSProxyProtocol v1.2+ |
內容 | 伺服器設定、虛擬主機、代理區段 |
狀態 | 實驗性 |
模組 | mod_tls |
預設為 `v1.2+`。將其設定為 `v1.3+` 會停用 TLSv1.2。
描述 | 指定 TLS 會話恢復快取。 |
---|---|
語法 | TLSSessionCache cache-spec |
內容 | 伺服器組態 |
狀態 | 實驗性 |
模組 | mod_tls |
這會在伺服器端使用快取,讓客戶端得以恢復連線。
您可以將其設定為 `none`,或定義快取,如同 SSLSessionCache
指令中的 mod_ssl
。
若未設定,mod_tls
將嘗試自行建立共用的記憶體快取,使用 `shmcb:tls/session-cache` 作為規範。如果失敗,系統會記錄警告,但伺服器將會繼續執行。
可用語言: en