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

适用于:Windows Server 2022、Windows Server 2019、Windows Server 2016、Windows 10和早期版本(如所述)。

本文介绍传输层安全性 (TLS) 协议和安全套接字层 (SSL) 协议的 Windows 实现支持的注册表设置信息 (SSP) 。 本文中介绍的注册表子项和条目可帮助你管理和排查 SChannel SSP 问题,尤其是 TLS 和 SSL 协议。

注意

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

注意

不建议通过注册表设置禁用 SChannel 组件,并且已正式弃用以调用加密组件的特定行为。

SChannel 日志记录

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

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

注意

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

CertificateMappingMethods

默认情况下,注册表中不存在此项。 其默认值为支持下面列出的四种证书映射方法。

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

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

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

默认情况下,Schannel 提供程序将使用以下四种证书映射方法(按优先顺序列出):

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

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

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

Ciphers

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

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

CipherSuites

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

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

ClientCacheTime

此项控制操作系统终止客户端缓存条目所需的时间(以毫秒为单位)。 值 0 表示关闭安全连接缓存。 默认情况下,注册表中不存在此项。

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

从 Windows Server 2008 和 Windows Vista 开始,默认客户端缓存时间为 10 小时。

注册表路径: 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 能够扩展到数千个可能具有数千个服务器证书的网站,因此在默认情况下将此行为设置为启用可能会导致性能问题。

适用版本:以 Windows Server 2012 和 Windows 8 开头的所有版本。

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

添加以下键:

“EnableOcspStaplingForSni”=dword:00000001

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

“EnableOcspStaplingForSni”=dword:00000000

注意

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

FIPSAlgorithmPolicy

此项控制美国联邦信息处理 (FIPS) 合规性。 默认值为 0。

适用版本:以 Windows Server 2012 和 Windows 8 开头的所有版本。

注册表路径: HKLM SYSTEM\CurrentControlSet\Control\LSA

Windows Server FIPS 密码套件:请参阅 Schannel SSP 中支持的密码套件和协议

哈希

应通过配置密码套件顺序来控制 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 密钥大小

默认情况下,注册表中可能不存在下面列出的这些条目,必须手动创建。 若要启用特定算法,请在相应的注册表路径中创建一个名为 Enabled 的注册表项,其 DWORD 值为 1。 也可以通过将 DWORD 值设置为 0 来禁用此功能。 建议对客户端和服务器密钥位长度使用最小 2048 位。

应通过配置密码套件顺序来控制密钥交换算法的使用。

在 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 位。

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

MaximumCacheSize

此项控制缓存元素的最大数目。 如果将 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^24-1 个字节。 允许客户端或服务器从网络读取和存储大量未经验证的数据不是一个好主意,并且会为每个安全上下文消耗额外的内存。

在 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

此项控制发送可信颁发者列表时所用的标志。 如果服务器针对客户端身份验证信任数百个证书颁发机构,那么,对服务器而言,颁发者太多,无法在客户端计算机请求客户端身份验证时将这些颁发者全部发送到客户端计算机。 在这种情况下,可以设置此注册表项,Schannel SSP 将不向客户端发送任何列表,而不是发送部分列表。

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

某些情况下,此行为是可取的。 例如,当 PKI 环境包含跨证书时,客户端和服务器证书将不具有相同的根 CA;因此,Internet Explorer 无法选择链接到服务器 CA 之一的证书。 通过将服务器配置为不发送可信颁发者列表,Internet Explorer 将发送其所有证书。

默认情况下,注册表中不存在此项。

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

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

此项控制操作系统终止服务器端缓存条目所需的时间(以毫秒为单位)。 值 0 表示禁用服务器端会话缓存并阻止重新连接。 将 ServerCacheTime 增大到超过默认值后,会导致 Lsass.exe 占用额外的内存。 每个会话缓存元素通常需要 2 到 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_CREDENTIALSSCHANNEL_CRED结构) 扩展。 建议 SSPI 调用方使用系统默认值,而不是施加协议版本限制。

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

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

系统管理员可以通过创建 DWORD 注册表值“Enabled”和“DisabledByDefault”来替代默认 (D) TLS 和 SSL 协议版本设置。 这些注册表值针对名为 的注册表子项下的协议客户端和服务器角色单独配置,使用以下格式:

<SSL/TLS/DTLS><主版本号>。<次要版本号><Client\Server>

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

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”的 DWORD 注册表值(条目值为“1”)和名为“DisabledByDefault”的 DWORD 注册表值(值为“0”。

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

在 Windows Server 注册表设置中将 TLS 1.0 客户端设置为启用的屏幕截图。

若要替代系统默认值并将支持的 (D) TLS 或 SSL 协议版本设置为 “默认禁用 ”状态,请在相应的特定于版本的子项下创建名为“Enabled”和“DisabledByDefault”的 DWORD 注册表值,该值为“0”或“1”。 以下示例演示将 TLS 1.0 服务器设置为 默认禁用 状态:

TLS 1.0 服务器端的 Windows Server 注册表设置中默认禁用状态的屏幕截图。

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

以下示例演示在注册表中禁用的 DTLS 1.2:

默认情况下,DTLS 1.2 的 Windows Server 注册表设置设置为禁用的屏幕截图。

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

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

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