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 的 Rust 实现的 TLS,通过其 C 接口 rustls-ffi。这提供了内存安全的加密和协议处理,性能相当。
它可以配置为前端和后端连接。配置指令大部分与 mod_ssl 的指令相似。

TLSCertificate
TLSCiphersPrefer
TLSCiphersSuppress
TLSEngine
TLSHonorClientOrder
TLSOptions
TLSProtocol
TLSProxyCA
TLSProxyCiphersPrefer
TLSProxyCiphersSuppress
TLSProxyEngine
TLSProxyMachineCertificate
TLSProxyProtocol
TLSSessionCache
TLSStrictSNIListen 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 装订 | 是 | 是* | *)通过 mod_md |
| 后端 OCSP 检查 | 是 | 否* | *)将验证装订 |
| 允许的 TLS 版本 | 最小-最大 | 最小 | |
| TLS 密码 | 排他列表 | 首选/抑制 | |
| TLS 密码排序 | 客户端/服务器 | 客户端/服务器 | |
| TLS 会话 | 是 | 是 | |
| SNI 严格性 | 默认否 | 默认是 | |
| 选项 EnvVars | 详尽 | 有限* | *)参见变量列表 |
| 选项 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 密码列表。所有 TLS v1.3 密码都受支持。对于 TLS v1.2,仅支持 rustls 认为安全的密码。
mod_tls 支持以下 TLS 密码名称
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384ECDHE-ECDSA-AES256-SHA384。此类名称通常出现在文档中。mod_tls 为所有 TLS v1.2 密码定义了它们。对于 TLS v1.3 密码,也支持以 TLS13_ 开头的名称。0xc024。您可以在配置中使用 TLS_CIPHER_0xc024。您可以配置对密码的偏好,这意味着它们将用于支持它们的客户端。如果您没有配置偏好,rustls 将使用它认为最好的密码。建议这样做。
如果您仍然需要优先使用一个密码而不是另一个密码,您可以这样配置
TLSCiphersPrefer ECDHE-ECDSA-AES256-SHA384 # or several TLSCiphersPrefer ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305
如果您命名了一个未知的密码,配置将失败。如果您命名的密码不受 rustls 支持(或由于安全原因不再受 rustls 的更新版本支持),mod_tls 将记录一个 WARNING,但会继续工作。
如果您想禁用特定密码,则存在类似的机制
TLSCipherSuppress ECDHE-ECDSA-AES256-SHA384
被抑制的密码将不再使用。如果您命名了一个未知的密码,配置将失败。如果您命名的密码不受 rustls 支持(或由于安全原因不再受 rustls 的更新版本支持),mod_tls 将记录一个 WARNING,但会继续工作。
mod_tls 使用 SNI(服务器名称指示)来选择与正在服务的端口匹配的已配置虚拟主机之一。如果客户端没有提供 SNI,将选择第一个配置的虚拟主机。如果客户端确实提供了 SNI(就像今天所有的客户端都做的那样),它必须与一个虚拟主机(ServerName 或 ServerAlias)匹配,否则连接将失败。
与 mod_ssl 一样,您可以为基本服务器(全局)和/或通过 SNI 由客户端选择的单个虚拟主机指定密码和协议版本。
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 设置。这是支持的。example1 可以通过所有 TLS 版本联系,而 example2 仅允许 v1.3 或更高版本。
通过 mod_md 的 ACME 证书受支持,就像 mod_ssl 一样。最小配置
Listen 443 TLSEngine 443 MDomain example.net <VirtualHost *:443> ServerName example.net ... </VirtualHost>
通过指令 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 会话 ID,则为 `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 |
这在全局级别设置,而不是在单个 <VirtualHost> 中设置。它将影响所有与指定地址/端口匹配的 <VirtualHost>。您可以多次使用 TLSEngine 来使用多个地址/端口。
TLSEngine 443
该示例告诉 mod_tls 处理所有监听器在端口 443 上的传入连接。
| 描述 | 确定是否尊重客户端支持的密码顺序。 |
|---|---|
| 语法 | TLSHonorClientOrder on|off |
| 默认 | TLSHonorClientOrder on |
| 上下文 | 服务器配置,虚拟主机 |
| 状态 | 实验性 |
| 模块 | mod_tls |
TLSHonorClientOrder 确定是否尊重客户端支持的密码顺序。
| 描述 | 为请求启用 SSL 变量。 |
|---|---|
| 语法 | TLSOptions [+|-]option |
| 上下文 | 服务器配置、虚拟主机、目录、.htaccess |
| 状态 | 实验性 |
| 模块 | mod_tls |
TLSOptions 与 mod_ssl 中的 SSLOptions 类似。它可以按目录/位置设置,`option` 可以是
将变量添加到请求环境会增加开销,尤其是在需要检查证书并提取字段时。因此,大多数变量默认情况下不会设置。
您可以按位置配置 TLSOptions,或者在服务器/虚拟主机上全局配置。在选项前加 `-` 会禁用该选项,而不会更改其他选项。`+` 前缀与不加前缀的选项相同。
`Defaults` 值可用于重置从其他位置或虚拟主机/服务器继承的任何选项。
<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 与 mod_ssl 中的 SSLProxyEngine 类似。
| 描述 | 将证书和密钥文件(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`,或者像 mod_ssl 的 SSLSessionCache 指令中那样定义缓存。
如果未配置,`mod_tls` 将尝试自行创建共享内存缓存,使用 `shmcb:tls/session-cache` 作为规范。如果失败,将记录警告,但服务器将继续运行。
可用语言: en