现已在 Windows Server 2019 上按证书绑定提供 TLS 版本强制实施功能
此帖子的作者是
Andrew Marshall,客户安全与信任部门的首席安全项目经理
Gabriel Montenegro,核心网络部门的首席项目经理
Niranjan Inamdar,核心网络部门的高级软件工程师
Michael Brown,互联网信息服务的高级软件工程师
Ivan Pashov,核心网络部门的首席软件工程主管
2019 年 8 月
随着全球的工程师都在努力消除自己对 TLS 1.0 的依赖,他们面临的复杂挑战是,平衡客户的迁移准备情况与自己的安全需求之间的关系。 到目前为止,我们已通过向较早版本的操作系统添加 TLS 1.2 支持来帮助客户解决这些问题,方法是在 IIS 中发送新的日志记录格式来检测客户端使用弱 TLS 的情况,并提供最新的技术指南来消除 TLS 1.0 依赖。
Microsoft 现在很高兴地宣布 Windows 中一项强大的新功能,让你能够更轻松地过渡到 TLS 1.2+ 世界。 从 KB4490481 开始,Windows Server 2019 现在允许阻止弱 TLS 版本与指定的单个证书结合使用。 我们将此功能称为“禁用旧版 TLS”,并对所选的任何证书有效地实施 TLS 版本和密码套件层。
“禁用旧版 TLS”还允许在线服务在同一硬件上提供两个不同的终结点分组:一个仅允许 TLS 1.2+ 流量,另一个用于容纳旧版的 TLS 1.0 流量。 这些更改是在 HTTP.sys 中实现的,并与其他证书的颁发一起,允许流量通过适当的 TLS 版本路由到新终结点。 在此更改之前,部署此类功能需要额外的硬件投资,因为此类设置只能通过注册表在系统范围内进行配置。
功能应用场景详细信息
一种常见的部署方案是,数据中心中某组硬件的客户有着不同的需求:有些客户当前需要使用 TLS 1.2 作为强制实施的最低要求,另一些尚未消除对 TLS 1.0 的依赖。 图 1 说明了作为完全独立的操作的 TLS 版本选择和证书绑定。 这是默认功能:
图 1:默认 TLS 版本选择和证书绑定功能
secure.contoso.com 会将客户定向到仅支持 TLS 1.2 和更高版本的服务终结点。
legacy.contoso.com 会将具有旧版 TLS 1.0 需求的客户(例如仍要迁移到 TLS 1.2 的客户)定向到在一段时间内支持 TLS 1.0 的终结点。 这允许客户在不中断服务的情况下完成 TLS 1.2 的准备情况测试,也不会妨碍已准备好迁移到 TLS 1.2 的其他客户。
传统上,需要两个物理上独立的主机来处理所有流量,并提供 TLS 版本强制实施,因为使用最低协议版本的维护 TLS 请求需要通过系统范围的注册表设置来禁用较弱的协议。 我们已将此功能放在堆栈中较高的位置,在这里 TLS 会话会绑定到证书,因此可以按下面的图 2 所述分配特定的最低 TLS 版本。
图 2:“禁用旧版 TLS”功能会为所选证书 Secure.contoso.com 强制实施最低 TLS 版本。
功能部署指南
可以使用 PowerShell 命令或 C++ HTTP.sys API,通过 Internet Information Services (IIS) 服务器 UI 来部署“禁用旧版 TLS”功能。
选项 #1:IIS UI 配置(在 Windows 10 版本 2004 和 Windows Server 版本 2004 及更新版本中可用)
如下所示为 SSL 证书“secure.contoso.com”创建站点绑定,然后选中“禁用旧版 TLS”并单击“确定”。
选项 #2:PowerShell(在 Windows 10 版本 2004 和 Windows Server 版本 2004 及更新版本中可用)
在 PowerShell 中,可以引用 SSL 标记,如下所示:
[Microsoft.Web.Administration.SslFlags]::DisableLegacyTLS
为它们创建较短的命名变量很方便:
$Sni = [Microsoft.Web.Administration.SslFlags]::Sni
$Sni\_CCS = [Microsoft.Web.Administration.SslFlags]::Sni + [Microsoft.Web.Administration.SslFlags]::CentralCertStore
$CCS = [Microsoft.Web.Administration.SslFlags]::CentralCertStore
$DisableLegacyTLS = [Microsoft.Web.Administration.SslFlags]::DisableLegacyTLS
$storeLocation = "Cert:\\LocalMachine\\My"
创建到新站点的站点绑定并禁用旧版 TLS 的示例:
$BindingInformation = "\*:443:"
$siteName = "contoso"
$Thumbprint = $certificate.ThumbPrint
具有 Sslflag DisableLegacyTLS 属性值的新 IIS 站点:
New-IISSite $siteName "$env:systemdrive\\inetpub\\wwwroot" "\*:443:secure.contoso.com" https $certificate.Thumbprint $DisableLegacyTLS $storeLocation -passthru
添加到现有站点的站点绑定并禁用旧版 TLS 的示例:
New-IISSiteBinding -Name "Default Web Site" -BindingInformation $BindingInformation -CertificateThumbPrint $certificate.Thumbprint -Protocol https -SslFlag $DisableLegacyTLS, $CCS -Force -verbose
此外,还可以通过 Netsh 进行故障排除并测试此功能:
添加新绑定:
netsh http add sslcert <regular parameters> disablelegacytls=enable
更新现有绑定:
netsh http update sslcert <regular parameters> disablelegacytls=enable
检查是否在绑定上进行了设置:
netsh http show sslcert <regular parameters>
请注意禁用旧 TLS 版本:设置/未设置
选项 #3:C++ HTTP.sys API(现已推出)
除了“禁用旧版 TLS”以外,还向 HTTP.sys 添加了以下标记:
HTTP_SERVICE_CONFIG_SSL_PARAM.DefaultFlags 现在支持以下新值:
HTTP_SERVICE_CONFIG_SSL_FLAG_ENABLE_SESSION_TICKET:为特定 SSL 终结点启用/禁用会话票证。
HTTP_SERVICE_CONFIG_SSL_FLAG_LOG_EXTENDED_EVENTS:为特定 SSL 终结点启用/禁用扩展事件日志。 其他事件将记录到 Windows 事件日志中。 目前为止仅支持一个事件,SSL 握手失败时将记录该事件。
HTTP_SERVICE_CONFIG_SSL_FLAG_DISABLE_LEGACY_TLS:为特定 SSL 终结点启用/禁用旧 TLS 版本。 设置此标记将为该终结点禁用 TLS 1.0/1.1,并且还将限制可用于 HTTP2 密码套件的密码套件。
HTTP_SERVICE_CONFIG_SSL_FLAG_DISABLE_TLS12:为特定 SSL 终结点启用/禁用 TLS1.2。
HTTP_SERVICE_CONFIG_SSL_FLAG_DISABLE_HTTP2:为特定 SSL 终结点启用/禁用 HTTP/2。
使用 C++ 按证书启用/禁用此功能的最简单方法是使用 HttpSetServiceConfiguration HTTP.sys API 提供的 HTTP_SERVICE_CONFIG_SSL_FLAG_DISABLE_LEGACY_TLS 标记。
设置“禁用旧版 TLS”后,将强制实施以下限制:
禁用 SSL2、SSL3、TLS1.0 和 TLS1.1 协议。
禁用加密密码 DES、3DES 和 RC4(因此仅使用 AES)。
使用 CBC 链模式禁用加密密码 AES(因此仅使用 AES GCM)。
禁用 RSA 密钥交换。
禁用密钥大小小于 2048 的 DH 密钥交换。
禁用密钥大小小于 224 的 ECDH 密钥交换。
这些更改的官方文档即将在 docs.Microsoft.com 上提供。
TLS 版本强制实施的后续步骤
“禁用旧版 TLS”为在特定证书/终结点绑定上强制实施 TLS 版本/密码套件层提供了强大的新功能。 该功能还要求你规划对在启用此功能时颁发的证书进行命名。 一些注意事项包括:
我现在是否需要服务终结点的默认路径来强制实施 TLS 1.2,并为需要 TLS 1.0 的用户提供不同的证书作为备份“旧”访问点?
我默认已在使用的 Contoso 证书是否应使用“禁用旧版 TLS”? 如果是,则可能需要提供 legacy.contoso.com 证书,并将其绑定到允许 TLS 1.0 的终结点。
如何以最佳方式将这些证书的建议使用方法传达给客户?
可以利用此功能来满足大批客户的需求:需要使用 TLS 1.2+ 的用户,以及仍在从 TLS 1.0 进行迁移的客户,所有这些操作都不会产生额外的硬件支出。 除了目前在 Windows Server 2019 中提供按证书的 TLS 版本绑定之外,Microsoft 还将根据客户需求,使“禁用旧版 TLS”可在其联机服务中使用。