Windows 10 和 Windows Server 2016 中的 TLS (Schannel SSP) 更改
密码套件更改
Windows 10 版本 1511 和 Windows Server 2016 添加了对使用移动设备管理 (MDM) 配置密码套件顺序的支持。
有关密码套件优先级顺序更改,请参阅 Schannel 中的密码套件。
添加了对以下密码套件的支持:
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (RFC 5289)(Windows 10 版本 1507 和 Windows Server 2016)
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (RFC 5289)(Windows 10 版本 1507 和 Windows Server 2016)
以下密码套件的 DisabledByDefault 更改:
- TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 (RFC 5246)(Windows 10 版本 1703)
- TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 (RFC 5246)(Windows 10 版本 1703)
- TLS_DHE_DSS_WITH_AES_256_CBC_SHA (RFC 5246)(Windows 10 版本 1703)
- TLS_DHE_DSS_WITH_AES_128_CBC_SHA (RFC 5246)(Windows 10 版本 1703)
- TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA (RFC 5246)(Windows 10 版本 1703)
- TLS_RSA_WITH_RC4_128_SHA(Windows 10 版本 1709)
- TLS_RSA_WITH_RC4_128_MD5(Windows 10 版本 1709)
从 Windows 10 版本 1507 和 Windows Server 2016 开始,默认支持 SHA 512 证书。
RSA 密钥更改
Windows 10 版本 1507 和 Windows Server 2016 添加了针对客户端 RSA 密钥大小的注册表配置选项。
有关详细信息,请参阅 KeyExchangeAlgorithm 密钥大小。
Diffie-Hellman 密钥更改
Windows 10 版本 1507 和 Windows Server 2016 添加了针对 Diffie-Hellman 密钥大小的注册表配置选项。
有关详细信息,请参阅 KeyExchangeAlgorithm 密钥大小。
SCH_USE_STRONG_CRYPTO 选项更改
在 Windows 10 版本 1507 和 Windows Server 2016 中,SCH_USE_STRONG_CRYPTO 选项现在禁用 NULL、MD5、DES 和导出密码。
椭圆曲线更改
Windows 10 版本 1507 和 Windows Server 2016 添加了针对椭圆曲线的组策略配置(可在“计算机配置”>“管理模板”>“网络”>“SSL 配置设置”下找到)。 ECC 曲线顺序列表指定了椭圆曲线的优先顺序,以及启用未启用的受支持曲线。
添加了对以下椭圆曲线的支持:
- BrainpoolP256r1 (RFC 7027)(Windows 10 版本 1507 和 Windows Server 2016)
- BrainpoolP384r1 (RFC 7027)(Windows 10 版本 1507 和 Windows Server 2016)
- BrainpoolP512r1 (RFC 7027)(Windows 10 版本 1507 和 Windows Server 2016)
- Curve25519 (RFC draft-ietf-tls-curve25519)(Windows 10 版本 1607 和 Windows Server 2016)
SealMessage 和 UnsealMessage 的调度级别支持
Windows 10 版本 1507 和 Windows Server 2016 在调度级别添加了对 SealMessage/UnsealMessage 的支持。
DTLS 1.2
Windows 10 版本 1607 和 Windows Server 2016 添加了对 DTLS 1.2 (RFC 6347) 的支持。
HTTP.SYS 线程池
Windows 10 版本 1607 和 Windows Server 2016 添加了针对用于处理 HTTP.SYS TLS 握手的线程池大小的注册表配置。
注册表路径:
HKLM\SYSTEM\CurrentControlSet\Control\LSA
若要指定每个 CPU 核心的最大线程池大小,请创建 MaxAsyncWorkerThreadsPerCpu 项。 默认情况下,注册表中不存在此项。 创建该项后,将 DWORD 值更改为所需大小。 如果未配置,则每个 CPU 核心最多 2 个线程。
Next Protocol Negotiation (NPN) 支持
从 Windows 10 版本 1703 开始,Next Protocol Negotiation (NPN) 已删除,不再受支持。
预共享密钥 (PSK)
Windows 10 版本 1607 和 Windows Server 2016 添加了对 PSK 密钥交换算法的支持 (RFC 4279)。
添加了对以下 PSK 密码套件的支持:
- TLS_PSK_WITH_AES_128_CBC_SHA256 (RFC 5487)(Windows 10 版本 1607 和 Windows Server 2016)
- TLS_PSK_WITH_AES_256_CBC_SHA384 (RFC 5487)(Windows 10 版本 1607 和 Windows Server 2016)
- TLS_PSK_WITH_NULL_SHA256 (RFC 5487)(Windows 10 版本 1607 和 Windows Server 2016)
- TLS_PSK_WITH_NULL_SHA384 (RFC 5487)(Windows 10 版本 1607 和 Windows Server 2016)
- TLS_PSK_WITH_AES_128_GCM_SHA256 (RFC 5487)(Windows 10 版本 1607 和 Windows Server 2016)
- TLS_PSK_WITH_AES_256_GCM_SHA384 (RFC 5487)(Windows 10 版本 1607 和 Windows Server 2016)
不带服务器端状态的会话恢复的服务器端性能改进
与 Windows Server 2012 相比,Windows 10 版本 1507 和 Windows Server 2016 使用会话票证每秒恢复会话的性能提高了 30%。
会话哈希和扩展主密钥扩展
Windows 10 版本 1507 和 Windows Server 2016 添加了对 RFC 7627:传输层安全性 (TLS) 会话哈希和扩展主密钥扩展的支持。
由于此更改,Windows 10 和 Windows Server 2016 需要第三方 CNG SSL 提供程序更新以支持 NCRYPT_SSL_INTERFACE_VERSION_3 并描述此新接口。
SSL 支持
从 Windows 10 版本 1607 和 Windows Server 2016 开始,默认禁用 TLS 客户端和服务器 SSL 3.0。 这意味着,除非应用程序或服务专门通过 SSPI 请求 SSL 3.0,否则客户端永远不会提供或接受 SSL 3.0,服务器将永远不会选择 SSL 3.0。
从 Windows 10 版本 1607 和 Windows Server 2016 开始,SSL 2.0 已删除,不再受支持。
对 Windows TLS 的更改遵守不符合 TLS 客户端连接的 TLS 1.2 要求
在 TLS 1.2 中,客户端使用 “signature_algorithms”扩展指示服务器可以在数字签名(即服务器证书和服务器密钥交换)中使用签名/哈希算法对。 TLS 1.2 RFC 还要求服务器证书消息接受“signature_algorithms”扩展:
“如果客户端提供了‘signature_algorithms’扩展,则服务器提供的所有证书都必须由该扩展中显示的哈希/签名算法对进行签名。”
实际上,某些第三方 TLS 客户端不符合 TLS 1.2 RFC,并且无法在“signature_algorithms”扩展中包含其愿意接受的所有签名和哈希算法对,或者完全省略扩展(后者向服务器指示客户端仅支持 带有 RSA、DSA 或 ECDSA 的 SHA1)。
TLS 服务器通常只为每个终结点配置一个证书,这意味着服务器无法始终提供满足客户端要求的证书。
在 Windows 10 和 Windows Server 2016 之前,Windows TLS 堆栈严格遵守 TLS 1.2 RFC 要求,导致不符合 RFC 的 TLS 客户端的连接失败和互操作性问题。 在 Windows 10 和 Windows Server 2016 中,约束会放宽,服务器可以发送不符合 TLS 1.2 RFC 的证书(如果这是服务器的唯一选项)。 然后,客户端可以继续或终止握手。
验证服务器和客户端证书时,Windows TLS 堆栈严格遵循 TLS 1.2 RFC,只允许在服务器和客户端证书中使用协商的签名和哈希算法。