传输层安全性 (TLS) 注册表设置
本文解释传输层安全性 (TLS) 协议和安全套接字层 (SSL) 协议的 Windows 实现通过 SChannel 安全支持提供程序 (SSP) 支持的注册表设置信息。 本文中所述的注册表子项和注册表项可帮助你管理 SChannel SSP(具体而言,是 TLS 和 SSL 协议)并解决相关问题。
注意
在排除故障或验证是否应用了必需的设置时,可参考本信息。 除非万不得已,否则建议不要直接编辑注册表。 在应用对注册表的修改之前,注册表编辑器或 Windows 操作系统不会对这些修改进行验证。 因此,可能会存储不正确的值,从而可能导致系统出现不可恢复的错误。 如果可能,请使用组策略或其他 Windows 工具(如 Microsoft 管理控制台 (MMC)),而不要直接编辑注册表。 如果必须编辑注册表,请格外小心。
SChannel 日志记录
保存到系统事件日志的 SChannel 事件有八个日志记录级别,可以使用事件查看器查看这些事件。 此注册表路径存储在 HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL
EventLogging 键下,DWORD 值设置为 1。
十进制或十六进制 | SChannel 日志记录事件 |
---|---|
0 | 无事件 |
1 | 错误事件 |
2 | 警告事件 |
3 | 错误和警告事件 |
4 | 信息性和成功事件 |
5 | 错误、信息性和成功事件 |
6 | 警告、信息性和成功事件 |
7 | 错误、警告、信息性和成功事件 |
注意
更改 SChannel 日志记录级别后,必须重新启动设备。
CertificateMappingMethods
当服务器应用程序需要客户端身份验证时,SChannel 会自动尝试将客户端计算机提供的证书映射到用户帐户。 通过创建将证书信息与 Windows 用户帐户关联的映射,你可以对使用客户端证书登录的用户进行身份验证。
创建并启用证书映射后,客户端每次出示客户端证书时,服务器应用程序都会自动将该用户与相应的 Windows 用户帐户关联。
在大多数情况下,证书通过以下两种方式之一映射到用户帐户:
- 单个证书映射到单个用户帐户(一对一映射)。
- 多个证书映射到一个用户帐户(多对一映射)。
SChannel 提供程序使用四种证书映射方法:
- Kerberos service-for-user (S4U) 映射(默认情况下启用)
- 用户主体名称映射
- 一对一映射关系(也称为使用者/颁发者映射)
- 多对一映射
注册表路径: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 密钥大小
默认情况下,注册表中可能不存在以下条目,必须手动创建。 应通过配置密码套件顺序来控制密钥交换算法的使用。 要了解有关 TLS/SSL 密码套件加密算法的更多信息,请参阅 TLS/SSL 中的密码套件 (SChannel SSP)。
在 Windows 10 版本 1507 和 Windows Server 2016 中添加。
注册表路径:HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\Diffie-Hellman
若要为 TLS 客户端指定最低支持的 Diffie-Hellman 密钥位长度范围,请创建一个 ClientMinKeyBitLength
条目。 创建条目后,将 DWORD 值更改为所需的位长度。 如果未配置,则最小值为 1024 位。
注意
配置的椭圆曲线确定 ECDHE 密钥交换的加密强度。 有关详细信息,请参阅管理传输层安全性 (TLS)。
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 的服务器发送其受信任颁发者列表。
不发送受信任颁发者列表可能会影响客户端在请求客户端证书时发送的内容。 例如,当 Microsoft Edge 收到客户端身份验证请求时,它仅显示与服务器发送的最多一个证书颁发机构链接的客户端证书。 如果服务器未发送列表,Microsoft Edge 将显示客户端上安装的所有客户端证书。
某些情况下,此行为是可取的。 例如,当 PKI 环境包括跨证书时,客户端和服务器证书没有相同的根 CA。 因此,Microsoft Edge 无法选择一个链接到服务器 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> <major version number>.<minor version number><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
状态,请在相应的版本特定的子项下创建一个名为“1”的条目值为“1”的 DWORD 注册表值Enabled
。
以下示例显示了设置为“已启用”状态的 TLS 1.0 客户端:
若要替代系统默认值并将受支持的 (D)TLS 或 SSL 协议版本设置为 Disabled
状态,请将相应版本特定的子项下的 DWORD 注册表值 Enabled
更改为“0”。
以下示例显示了在注册表中已禁用的 DTLS 1.2:
将 (D)TLS 或 SSL 协议版本切换为 Disabled
状态可能会导致 AcquireCredentialsHandle 调用失败,因为缺少启用了系统范围的协议版本,并且特定 SSPI 调用方同时允许。 此外,减少一组 Enabled
(D)TLS 和 SSL 版本可能会中断与远程对等方的互操作性。
一旦修改了 (D)TLS 或 SSL 协议版本设置,它们就会在使用由后续 AcquireCredentialsHandle 调用打开的凭证句柄建立的连接上生效。 出于性能原因,(D)TLS 与 SSL 客户端和服务器应用程序及服务倾向于重复使用凭据句柄来建立多个连接。 若要让这些应用程序重新获取其凭据句柄,可能需要应用程序或服务重启。
这些注册表设置仅适用于 SChannel SSP,不会影响系统上可能安装的任何第三方 (D)TLS 和 SSL 实现。
警告
不建议尝试创建或调整本文未明确详细说明的任何 SChannel 注册表设置,因为不支持的配置可能会带来潜在风险和意想不到的后果。
要了解如何使用 PowerShell 管理 TLS 密码套件,请参阅 TLS 命令参考。 如果对通过组策略管理 TLS 设置感兴趣,请参阅使用组策略配置 TLS 密码套件顺序。