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
的指令相似。
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 装订 | 是 | 是* | *)通过 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_SHA384
ECDHE-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