传输层安全性 (TLS) 注册表设置

适用于:Windows Server 2022、Windows Server 2019、Windows Server 2016、Windows 11、Windows 10 和注明的更低版本

本文解释传输层安全性 (TLS) 协议和安全套接字层 (SSL) 协议的 Windows 实现通过 SChannel 安全支持提供程序 (SSP) 支持的注册表设置信息。 本文中所述的注册表子项和注册表项可帮助你管理 SChannel SSP(具体而言,是 TLS 和 SSL 协议)并解决相关问题。

注意

在排除故障或验证是否应用了必需的设置时,可参考本信息。 除非万不得已,否则建议不要直接编辑注册表。 在应用对注册表的修改之前,注册表编辑器或 Windows 操作系统不会对这些修改进行验证。 因此,可能会存储不正确的值,从而可能导致系统出现不可恢复的错误。 如果可能,请使用组策略或其他 Windows 工具(如 Microsoft 管理控制台 (MMC)),而不要直接编辑注册表。 如果必须编辑注册表,请格外小心。

SChannel 日志记录

保存到系统事件日志的 SChannel 事件有八个日志记录级别,可以使用事件查看器查看这些事件。 此注册表路径存储在 EventLogging 项下的 HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL 中,DWORD 值设置为 1。

十进制或十六进制 SChannel 日志记录事件
0 无事件
1 错误事件
2 警告事件
3 错误和警告事件
4 信息性和成功事件
5 错误、信息性和成功事件
6 警告、信息性和成功事件
7 错误、警告、信息性和成功事件

注意

更改 SChannel 日志记录级别后,必须重新启动设备。

CertificateMappingMethods

当服务器应用程序需要客户端身份验证时,SChannel 会自动尝试将客户端计算机提供的证书映射到用户帐户。 通过创建将证书信息与 Windows 用户帐户关联的映射,你可以对使用客户端证书登录的用户进行身份验证。

创建并启用证书映射后,客户端每次出示客户端证书时,服务器应用程序都会自动将该用户与相应的 Windows 用户帐户关联。

在大多数情况下,证书通过以下两种方式之一映射到用户帐户:

  • 单个证书映射到单个用户帐户(一对一映射)。
  • 多个证书映射到一个用户帐户(多对一映射)。

SChannel 提供程序使用四 (4) 种证书映射方法:

  1. Kerberos service-for-user (S4U) 映射(默认情况下启用)
  2. 用户主体名称映射
  3. 一对一映射关系(也称为使用者/颁发者映射)
  4. 多对一映射

注册表路径:HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL

注册表项名称 DWORD 默认情况下启用
使用者/颁发者 0x000000001
颁发者 0x000000002
UPN 0x000000004
S4U2Self 0x000000008
S4U2Self Explicit 0x000000010

适用的版本:本文开头的“适用于”列表中指定的版本。

Ciphers

应通过配置密码套件顺序来控制 TLS/SSL 密码。 有关详细信息,请参阅配置 TLS 密码套件顺序

有关 SChannel SSP 使用的默认密码套件顺序的信息,请参阅 TLS/SSL (SChannel SSP) 中的密码套件

CipherSuites

应使用组策略、MDM 或 PowerShell 配置 TLS/SSL 密码套件,有关详细信息,请参阅配置 TLS 密码套件顺序

有关 SChannel SSP 使用的默认密码套件顺序的信息,请参阅 TLS/SSL (SChannel SSP) 中的密码套件

ClientCacheTime

此项指定客户端 TLS 会话缓存项生存期(以毫秒为单位)。 从 Windows Server 2008 和 Windows Vista 开始,默认为 10 小时。 如果值为 0,则关闭客户端上的 TLS 会话缓存。

客户端第一次通过 SChannel SSP 连接到服务器时,将执行完整的 TLS/SSL 握手。 完成握手后,主密钥、密码套件和证书将存储在各自的客户端和服务器上的会话缓存中。

注册表路径:HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL

EnableOcspStaplingForSni

在线证书状态协议 (OCSP) 装订使 Web 服务器(例如 Internet Information Services (IIS))能够在 TLS 握手期间将服务器证书发送给客户端时,提供服务器证书的当前吊销状态。 此功能减少了 OCSP 服务器上的负载,因为 Web 服务器可以缓存服务器证书的当前 OCSP 状态并将其发送到多个 Web 客户端。 如果没有此功能,每个 Web 客户端都会尝试从 OCSP 服务器检索服务器证书的当前 OCSP 状态。 这会在该 OCSP 服务器上产生较高的负载。

除了 IIS 之外,基于 http.sys 的 Web 服务也可以从此设置中受益,包括 Active Directory 联合身份验证服务 (AD FS) 和 Web 应用程序代理 (WAP)。

默认已为具有简单安全 (SSL/TLS) 绑定的 IIS 网站启用了 OCSP 支持。 但是,如果 IIS 网站使用以下一种或两种类型的 SSL/TLS 绑定,则默认不会启用此支持:

  • 需要服务器名称指示
  • 使用集中式证书存储

在这种情况下,在 TLS 握手期间做出的服务器 hello 响应默认不会包含 OCSP 装订状态。 此行为提高了性能:Windows OCSP 装订实现可扩展到数百个服务器证书。 但是,服务器名称指示 (SNI) 和中央证书存储 (CCS) 使 IIS 能够扩展到可能具有数千个服务器证书的数千个网站,因此为 CCS 绑定启用 OCSP 装订可能会导致性能问题。

适用版本:Windows Server 2012 和 Windows 8 及所有更高版本。

注册表路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL

添加以下注册表项:

"EnableOcspStaplingForSni"=dword:00000001

若要禁用,请将 DWORD 值设置为 0:

"EnableOcspStaplingForSni"=dword:00000000

注意

启用此注册表项可能会对性能造成影响。

哈希

应通过配置密码套件顺序来控制 TLS/SSL 哈希算法。 有关详细信息,请参阅配置 TLS 密码套件顺序

IssuerCacheSize

此项控制颁发者缓存的大小,它与颁发者映射一起使用。 SChannel SSP 尝试映射客户端证书链中的所有颁发者,而不只是客户端证书的直接颁发者。 如果颁发者未映射到帐户(这种情况很常见),服务器可能会尝试以每秒数百次的频率重复映射相同的颁发者名称。

为防止这种情况,服务器有一个负缓存,因此,如果某个颁发者名称未映射到帐户,会将它添加到负缓存中,在该缓存条目到期之前,SChannel SSP 不会尝试再次映射该颁发者名称。 此注册表项指定缓存大小。 默认情况下,注册表中不存在此项。 默认值为 100。

适用版本:Windows Server 2008 和 Windows Vista 及所有更高版本。

注册表路径:HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL

IssuerCacheTime

此项控制缓存超时间隔时长(以毫秒为单位)。 SChannel SSP 尝试映射客户端证书链中的所有颁发者,而不只是客户端证书的直接颁发者。 如果颁发者未映射到帐户(这种情况很常见),服务器可能会尝试以每秒数百次的频率重复映射相同的颁发者名称。

为防止这种情况,服务器有一个负缓存,因此,如果某个颁发者名称未映射到帐户,会将它添加到负缓存中,在该缓存条目到期之前,SChannel SSP 不会尝试再次映射该颁发者名称。 出于性能方面的考虑,将保留此缓存,以便系统不继续尝试映射相同的颁发者。 默认情况下,注册表中不存在此条目。 默认值为 10 分钟。

适用版本:Windows Server 2008 和 Windows Vista 及所有更高版本。

注册表路径:HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL

KeyExchangeAlgorithm 密钥大小

默认情况下,注册表中可能不存在下面列出的这些项,必须手动创建。 应通过配置密码套件顺序来控制密钥交换算法的使用。

已在 Windows 10 版本 1507 和 Windows Server 2016 中添加。

注册表路径:HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\Diffie-Hellman

若要为 TLS 客户端指定支持的最小 Diffie-Hellman 密钥位长度范围,请创建一个 ClientMinKeyBitLength 项。 创建该项后,将 DWORD 值更改为所需的位长度。 如果未配置,则最小值为 1024 位。

若要为 TLS 客户端指定支持的最大 Diffie-Hellman 密钥位长度范围,请创建一个 ClientMaxKeyBitLength 项。 创建该项后,将 DWORD 值更改为所需的位长度。

若要为 TLS 服务器指定默认的 Diffie-Hellman 密钥位长度,请创建一个 ServerMinKeyBitLength 项。 创建该项后,将 DWORD 值更改为所需的位长度。 如果未配置,则默认值为 2048 位。

注意

配置的椭圆曲线确定 ECDHE 密钥交换的加密强度。 有关详细信息,请参阅管理传输层安全性 (TLS)

若要详细了解 TLS/SSL 密码套件加密算法,请参阅:

MaximumCacheSize

此项控制要缓存的最大 TLS 会话数。 如果将 MaximumCacheSize 设置为 0,将禁用服务器端会话缓存并阻止会话恢复。 将 MaximumCacheSize 增大到超过默认值后,会导致 Lsass.exe 占用额外的内存。 每个会话缓存元素通常需要 2 KB 到 4 KB 的内存。 默认情况下,注册表中不存在此条目。 默认值为 20,000 个元素。

适用版本:Windows Server 2008 和 Windows Vista 及所有更高版本。

注册表路径:HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL

消息 – 片段分析

此项控制要接受的 TLS 握手消息的最大允许大小。 大于允许大小的消息将不被接受,并且 TLS 握手将会失败。 默认情况下,注册表中不存在这些项。

将值设置为 0x0 时,不会处理分段的消息,并将导致 TLS 握手失败。 这会导致当前计算机上的 TLS 客户端或服务器不符合 TLS RFC 规范。

可将允许的最大大小提高至 2^16 字节。 允许客户端或服务器从网络中读取并存储大量未经验证的数据不是一个好主意,这会导致在每个安全上下文中消耗更多的内存。

已在 Windows 7 和 Windows Server 2008 R2 中添加:Windows XP、Windows Vista 或 Windows Server 2008 中的 Internet Explorer 可以通过一项更新来分析分段的 TLS/SSL 握手消息。

注册表路径:HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Messaging

若要指定 TLS 客户端接受的分段 TLS 握手消息的最大允许大小,请创建一个 MessageLimitClient 项。 创建该项后,将 DWORD 值更改为所需的位长度。 如果未配置,默认值为 0x8000 字节。

在没有客户端身份验证的情况下,若要指定 TLS 服务器接受的分段 TLS 握手消息的最大允许大小,请创建一个 MessageLimitServer 项。 创建该项后,将 DWORD 值更改为所需的位长度。 如果未配置,默认值为 0x4000 字节。

在具有客户端身份验证的情况下,若要指定 TLS 服务器接受的分段 TLS 握手消息的最大允许大小,请创建一个 MessageLimitServerClientAuth 项。 创建该项后,将 DWORD 值更改为所需的位长度。 如果未配置,默认值为 0x8000 字节。

SendTrustedIssuerList

请求客户端身份验证时,TLS 服务器可能会发送可接受证书颁发机构的可分辨名称列表。 这可能有助于 TLS 客户端选择合适的 TLS 客户端证书。 默认情况下,基于 SChannel 的 TLS 服务器不会发送此受信任的颁发者列表,因为它会向被动观察者公开服务器信任的证书颁发机构,还会增加在 TLS 握手过程中交换的数据量。 将此值设置为 1 会导致基于 SChannel 的服务器发送其受信任颁发者列表。

不发送受信任颁发者列表可能会影响要求客户端提供客户端证书时客户端所发送的内容。 例如,当 Internet Explorer 收到客户端身份验证请求时,它仅显示与服务器发送的最多一个证书颁发机构链接的客户端证书。 如果服务器未发送列表,Internet Explorer 将显示客户端上安装的所有客户端证书。

某些情况下,此行为是可取的。 例如,当 PKI 环境包含交叉证书时,客户端证书和服务器证书不会有相同的根 CA;因此,Internet Explorer 不能选择与服务器的最多一个 CA 链接的证书。 当服务器不发送受信任颁发者列表时,TLS 客户端可能会提供任何可用的客户端证书。 默认情况下,注册表中不存在此条目。

默认发送受信任颁发者列表行为

Windows 版本 默认行为
Windows Server 2012、Windows 8 及更高版本 FALSE
Windows Server 2008 R2、Windows 7 及更低版本 TRUE

适用版本:Windows Server 2008 和 Windows Vista 及所有更高版本。

注册表路径:HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL

ServerCacheTime

此项指定服务器 TLS 会话缓存项生存期(以毫秒为单位)。 默认值为 10 小时。 如果值为 0,则关闭服务器上的 TLS 会话缓存,并阻止会话恢复。 将 ServerCacheTime 增大到超过默认值后,会导致 Lsass.exe 占用额外的内存。 每个会话缓存元素通常需要 2 KB 到 4 KB 的内存。 默认情况下,注册表中不存在此条目。

适用版本:Windows Server 2008 和 Windows Vista 及所有更高版本。

注册表路径:HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL

默认服务器缓存时间:10 个小时

TLS、DTLS 和 SSL 协议版本设置

SChannel SSP 实现 TLS、DTLS 和 SSL 协议的版本。 不同的 Windows 发行版支持不同的协议版本。 在系统范围内可用的 (D)TLS 和 SSL 版本集可由 SSPI 调用方限制(但不能扩展),方法是在 AcquireCredentialsHandle 调用中指定 SCH_CREDENTIALS 结构。 建议 SSPI 调用方使用系统默认值,而不要施加协议版本限制。

支持的 (D)TLS 或 SSL 协议版本可能处于以下状态之一:

  • 已启用:除非 SSPI 调用方使用 SCH_CREDENTIALS 结构显式禁用此协议版本,否则 SChannel SSP 可与支持对等方协商此协议版本。
  • 已禁用:无论 SSPI 调用方指定的设置如何,SChannel SSP 都不会协商此协议版本。

这些注册表值是为使用以下格式命名的注册表子项下的协议客户端和服务器角色单独配置的:

<SSL/TLS/DTLS><主版本号>.<次版本号><客户端\服务器>

可在以下注册表路径下创建这些特定于版本的子项:

HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols

例如,下面是一些包含特定于版本的子项的有效注册表路径:

  • HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client

  • HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server

  • HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\DTLS 1.2\Client

若要替代系统默认值并将支持的 (D)TLS 或 SSL 协议版本设置为“已启用”状态,请在相应的特定于版本的子项下,创建名为“Enabled”、项值为“1”的 DWORD 注册表值。

以下示例显示了设置为“已启用”状态的 TLS 1.0 客户端:

Screenshot of Set TLS 1.0 client-side to enabled in Windows Server registry setting.

若要替代系统默认值并将支持的 (D)TLS 或 SSL 协议版本设置为“已禁用”状态,请在相应的特定于版本的子项下,将“Enabled”的 DWORD 注册表值更改为“0”。

以下示例显示了在注册表中已禁用的 DTLS 1.2:

Screenshot of Windows Server registry setting for DTLS 1.2 set to disabled by default.

将 (D)TLS 或 SSL 协议版本切换为“已禁用”状态可能会导致 AcquireCredentialsHandle 调用失败,因为缺少在系统范围启用的、同时由特定 SSPI 调用方允许的协议版本。 此外,减少“已启用”的 (D)TLS 和 SSL 版本集可能会破坏与远程对等方的互操作性。

修改 (D)TLS 或 SSL 协议版本设置后,这些设置将对使用后续 AcquireCredentialsHandle 调用打开的凭据句柄建立的连接生效。 出于性能原因,(D)TLS 与 SSL 客户端和服务器应用程序及服务倾向于重复使用凭据句柄来建立多个连接。 为使这些应用程序能够重新获取其凭据句柄,可能需要重启应用程序或服务。

这些注册表设置仅应用于 SChannel SSP,而不会影响系统上可能已安装的任何第三方 (D)TLS 和 SSL 实现。