Microsoft Windows 上的 DisabledByDefault 和 Enabled SSL/TLS 注册表项有什么区别?

What is the difference between the DisabledByDefault and Enabled SSL/TLS registry keys on Microsoft Windows?

Microsoft 提供了传输层安全性 (TLS) 的最佳实践指南。本文档描述了可以启用或禁用特定协议的注册表项。

https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls#configuring-schannel-protocols-in-the-windows-registry

例如,要启用 TLS 1.2,您可以添加以下注册表项。

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:FFFFFFFF

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:FFFFFFFF

DisabledByDefaultEnabled 有什么区别?它们似乎是多余的。

DisabledByDefault 和 Enabled 不是多余的

DisabledByDefault标志设置为1时,默认不使用SSL/TLS版本X。如果 SSPI 应用程序请求使用此版本的 SSL/TLS,将进行协商。简而言之,当您使用 DisabledByDefault 标志时,SSL 不会被禁用。

Enabled 标志设置为 0 时,SSL / TLS 版本 X 被禁用并且无法通过任何 SSPI 应用程序协商(即使 DisabledByDefault 标志设置为 0)。

有关详细信息,Microsoft documentation 描述维护或不维护的 SSL 版本,以及如何禁用它。

SCHANNEL_CRED structure that is passed to AcquireCredentialsHandle as part of setting up a secure channel 中,您可以选择手动 select 要支持的协议,在 grbitEnabledProtocols 位掩码字段中。

因此,Enabled 控制您可以在此处启用哪些协议,而 DisabledByDefault 指定如果您省略此字段(即保留它如 0).

该领域的注释说不建议在新代码中使用它。所以这两个注册表值 almost 是多余的:

For new development, applications should set grbitEnabledProtocols to zero and use the protocol versions enabled on the system by default.

This member is used only by the Microsoft Unified Security Protocol Provider security package.

The global system registry settings take precedence over this value. For example, if SSL3 is disabled in the registry, it cannot be enabled using this member.

不清楚如果您尝试使用未启用的协议会发生什么。从最后一段和 a lack of any relevant AcquireCredentialsHandle error code for this case 来看,我猜它可能被忽略了。