总之,我们需要使用应用程序请求路由 3.0 安全地将对 Web 服务器发出的 HTTPS 请求反向代理到应用程序服务器上的同一 URL,其中两台服务器都运行 Windows Server 2008 R2。Web 服务器可以支持传入和传出 TLS 1.0 和 TLS 1.2 连接,但应用程序服务器仅允许支持传入连接的 TLS 1.2(允许传出 TLS 1.0,但可能与此问题无关)。
[浏览器] --TLS 1.0/1.2--> [Web 服务器 + ARR] --TLS 1.2--> [应用程序服务器]
我已在应用程序服务器上配置了 SCHANNEL 注册表设置,如下所示(出于格式原因,“HKEY_LOCAL_MACHINE”替换为“HKLM”)。Web 服务器的配置类似,但还启用了 TLS 1.0 客户端和服务器连接。注册表更改后,服务器重新启动。
[HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client]
"DisabledByDefault"=dword:00000001
[HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server]
"Enabled"=dword:00000000
[HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client]
"DisabledByDefault"=dword:00000001
[HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server]
"Enabled"=dword:00000000
[HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001
[HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000000
[HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client]
"DisabledByDefault"=dword:00000001
"Enabled"=dword:00000000
[HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server]
"DisabledByDefault"=dword:00000001
"Enabled"=dword:00000000
[HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001
[HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001
在大多数情况下,SCHANNEL 设置似乎按预期工作,但 ARR 将仅在与应用程序服务器的 SSL 握手的客户端 Hello 中提供 TLS 1.0,正如使用 Wireshark 和 NetMon 所观察到的那样。然后,由于应用程序服务器无法继续握手,并且 ARR 向浏览器返回 Bad Gateway 错误,因此连接被断开。直接从 Web 服务器向应用程序服务器发出浏览器 (IE 11) 请求会导致 TLS 1.2 握手成功。
从 Web 服务器禁用 TLS 1.0 客户端连接会导致 Web 服务器甚至不会发送客户端 Hello(并且会向浏览器返回错误网关响应,原因略有不同)。
在应用程序服务器上启用 TLS 1.0 服务器连接将导致 TLS 1.0 握手成功,并且 ARR 按预期代理请求。
我尝试使用的服务器已直接从 Windows Update 安装了所有更新。
无论是使用 IIS 服务器场还是将应用程序服务器名称硬编码到重写规则中似乎都没有任何区别。
相同的配置在 Windows Server 2012 上运行良好,并且我能够在 Azure 上创建的 Server 2008 R2 VM 上重现症状。
我真正想知道的是,ARR 和 Windows Server 2008 R2 是否真的可以实现这一点,如果可以,需要哪些额外的配置步骤或补丁。虽然其他技术的建议可能会有所帮助,但目前我们受到相当不灵活的要求的限制。
答案1
这将以某种方式更改操作系统默认设置,以允许所有 TLS 版本(或者如果您选择,甚至可以允许 SSL)。我在 ARR Windows 2008 R2 上对此进行了测试。 Windows 简易修复补丁
答案2
是的,这是可能的。
我通过 GPO 将注册表项部署到我的所有 Windows 7 2008 r2
上述来自 Microsoft IIS/ASP.NET 开发人员支持的回答不正确。由于声誉问题,我暂时无法发表评论。
这确实有效。已在 ARR 2008 R2 sp1 上确认更新。在注册密钥之前,ARR 传出(使用 winhttp)是 TLS 1.0 在注册密钥之后(我使用 A80 启用 TLS 1.0-1.2),ARR 使用 TLS 1.2 进行传出。
答案3
更新自此答案提交以来,Microsoft 已发布补丁和相关的解决方法步骤。请参阅较新的答案和评论以了解详细信息。
事实证明,答案是否定的,这是不可能的。
以下来自 Microsoft IIS/ASP.NET 开发人员支持的回复澄清了技术细节。
经过进一步调查,我们发现 Windows Server 2008 r2 和 ARR 使用 WinHTTP 发出出站请求,从而绑定到操作系统的默认协议。(SSL3 和 TLS 1.0)简短回答 - ARR 不支持使用 WINHTTP_OPTION_SECURE_PROTOCOLS 标志的 WinHttpSetOption 传递 WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2 值
WinHttp!Internet_Session_Handle_Object 直接从 %SDXROOT%\net\winhttp\inc\defaults.h 加载 dwSecureProtocols 值。Windows Server 2008 r2 仅支持 SSL3 和 TLS 1.0。可以将 IIS 配置为使用 TLS 1.2,但是 ARR 绑定到操作系统默认值,无论如何配置,ARR 始终使用 SSL 3 或 TLS 1.0。直到更改操作系统默认值。