<-
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 的 Rust 实现的 TLS,通过其 C 接口 rustls-ffi。这提供了内存安全的加密和协议处理,性能相当。

它可以配置为前端和后端连接。配置指令大部分与 mod_ssl 的指令相似。

Support Apache!

主题

指令

错误修复清单

另请参阅

top

虚拟主机上下文中的 TLS

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 装订是**)通过 mod_md
后端 OCSP 检查否**)将验证装订
允许的 TLS 版本最小-最大最小
TLS 密码排他列表首选/抑制
TLS 密码排序客户端/服务器客户端/服务器
TLS 会话
SNI 严格性默认否默认是
选项 EnvVars详尽有限**)参见变量列表
选项 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 密码列表。所有 TLS v1.3 密码都受支持。对于 TLS v1.2,仅支持 rustls 认为安全的密码。

mod_tls 支持以下 TLS 密码名称

  1. 使用 `_` 分隔部分的 IANA 分配的名称。例如:TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  2. 使用 `-` 作为分隔符的 OpenSSL 名称(对于 1.2)。例如:ECDHE-ECDSA-AES256-SHA384。此类名称通常出现在文档中。mod_tls 为所有 TLS v1.2 密码定义了它们。对于 TLS v1.3 密码,也支持以 TLS13_ 开头的名称。
  3. 使用 16 位数值的 IANA 分配的标识符。例如: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,但会继续工作。

top

虚拟主机

mod_tls 使用 SNI(服务器名称指示)来选择与正在服务的端口匹配的已配置虚拟主机之一。如果客户端没有提供 SNI,将选择第一个配置的虚拟主机。如果客户端确实提供了 SNI(就像今天所有的客户端都做的那样),它必须与一个虚拟主机(ServerNameServerAlias)匹配,否则连接将失败。

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 或更高版本。

top

ACME 证书

通过 mod_md 的 ACME 证书受支持,就像 mod_ssl 一样。最小配置

Listen 443
TLSEngine 443
MDomain example.net

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

OCSP 装订

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 会话 ID,则为 `Resumed`,否则为 `Initial`
SSL_SERVER_CERTExportCertData以 PEM 格式选择的服务器证书

变量 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

这在全局级别设置,而不是在单个 <VirtualHost> 中设置。它将影响所有与指定地址/端口匹配的 <VirtualHost>。您可以多次使用 TLSEngine 来使用多个地址/端口。

示例

TLSEngine 443

该示例告诉 mod_tls 处理所有监听器在端口 443 上的传入连接。

top

TLSHonorClientOrder 指令

描述确定是否尊重客户端支持的密码顺序。
语法TLSHonorClientOrder on|off
默认TLSHonorClientOrder on
上下文服务器配置,虚拟主机
状态实验性
模块mod_tls

TLSHonorClientOrder 确定是否尊重客户端支持的密码顺序。

top

TLSOptions 指令

描述为请求启用 SSL 变量。
语法TLSOptions [+|-]option
上下文服务器配置、虚拟主机、目录、.htaccess
状态实验性
模块mod_tls

TLSOptionsmod_ssl 中的 SSLOptions 类似。它可以按目录/位置设置,`option` 可以是

将变量添加到请求环境会增加开销,尤其是在需要检查证书并提取字段时。因此,大多数变量默认情况下不会设置。

您可以按位置配置 TLSOptions,或者在服务器/虚拟主机上全局配置。在选项前加 `-` 会禁用该选项,而不会更改其他选项。`+` 前缀与不加前缀的选项相同。

`Defaults` 值可用于重置从其他位置或虚拟主机/服务器继承的任何选项。

示例

<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

TLSProxyEnginemod_ssl 中的 SSLProxyEngine 类似。

这可以在服务器/虚拟主机或 <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`,或者像 mod_sslSSLSessionCache 指令中那样定义缓存。

如果未配置,`mod_tls` 将尝试自行创建共享内存缓存,使用 `shmcb:tls/session-cache` 作为规范。如果失败,将记录警告,但服务器将继续运行。

top

TLSStrictSNI 指令

描述强制客户端服务器指示器 (SNI) 与主机名的完全匹配。
语法TLSStrictSNI on|off
默认TLSStrictSNI on
上下文服务器配置
状态实验性
模块mod_tls

如果未找到匹配项,则使用 SNI 的客户端连接将失败。

可用语言:  en 

top

评论

注意
这不是问答部分。此处放置的评论应指向有关改进文档或服务器的建议,如果它们已实施或被认为无效/主题外,可能会被我们的版主删除。有关如何管理 Apache HTTP Server 的问题应直接发送到我们的 IRC 频道 #httpd(在 Libera.chat 上),或发送到我们的 邮件列表