现在,Windows Server 2019 上每个证书绑定都提供 TLS 版本强制实施

此文章作者

安德鲁马歇尔,首席安全项目经理,客户安全和信任

加布里埃尔黑山,核心网络的主要项目经理

Niranjan Inamdar,核心网络高级软件工程师

迈克尔布朗,互联网信息服务高级软件工程师

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 版本选择和证书绑定作为明显独立的操作。 这是默认功能:

默认 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 版本。

为所选证书强制实施最低 TLS 版本

图 2:禁用旧版 TLS 功能,为所选证书强制实施最低 TLS 版本,Secure.contoso.com。

功能部署指南

可以通过 Internet 信息服务(IIS)服务器 UI、PowerShell 命令或C++HTTP.sys API 部署禁用旧版 TLS 功能。

选项 #1:IIS UI 配置(在 Windows 10 版本 2004 和 Windows Server 版本 2004 及更新版本中可用)

为 SSL 证书“secure.contoso.com”创建站点绑定,如下所示,然后选中“禁用旧版 TLS”并单击“确定”。

IIS 用户界面

选项 #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 属性值的新 IISSite:

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 <常规参数>

    请注意禁用旧 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 版本。 设置此标志会禁用该终结点的 TLS1.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 版本绑定功能以外,微软还会根据客户需求,在其在线服务中提供禁用旧版 TLS 的功能。