此文章作者
安德鲁马歇尔,首席安全项目经理,客户安全和信任
加布里埃尔黑山,核心网络的主要项目经理
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 版本选择和证书绑定作为明显独立的操作。 这是默认功能:
图 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 功能,为所选证书强制实施最低 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”并单击“确定”。
选项 #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 的功能。