现已在 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 版本选择和证书绑定。 这是默认功能:

Default TLS Version selection

图 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 版本。

Enforcing minimum TLS version for a selected certificate

图 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”并单击“确定”。

IIS UI

选项 #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”可在其联机服务中使用。