强制PresentationHost使用TLS 1.2

5
一个服务器已经禁用了TLS 1.0/1.1。客户端是在Internet Explorer中运行的XBAP应用程序。看起来PresentationHost试图建立一个TLS 1.0连接,但由于服务器拒绝它而失败。我能否以某种方式强制(例如通过编程或配置文件)PresentationHost使用TLS 1.2?我知道可以相应地设置客户端的注册表(将SchUseStrongCrypto设置为1),但我希望避免用户配置任何内容。
3个回答

2
一般情况下,我会期望客户端协商支持和启用的最高TLS级别。由于您的连接在尝试仅使用TLS 1.0后失败,我怀疑客户端可能不支持和启用TLS1.1和TLS1.2。
使用.NET 4.7构建的应用程序将默认使用SecurityProtocolType.SystemDefault,该类型由操作系统选择并可以通过注册表设置进行修改。SecurityProtocolType被定义为:
“……SecurityProtocol属性的枚举类型。当您在.NET Framework中使用HTTP API(如WebClient、HttpWebRequest、HttpClient和SmtpClient(使用TLS/SSL))时,请使用此枚举来确定传输安全协议策略。”
早期的框架版本可能会默认使用特定的协议类型,而不管操作系统默认设置为何。在大多数情况下,它们仍应尝试其他启用的协议。
如果您看到的行为不是您想要的,那么首先要确保目标框架版本和操作系统版本都能够支持您想要启用的安全协议类型(例如,TLS 1.2)。操作系统版本支持的协议版本列表可以在此处找到。
如果目标版本的.Net和操作系统版本都支持TLS1.2,则可以通过设置ServicePointManager安全协议类型来强制连接仅接受TLS1.2。只需在进行网络调用之前设置它来限制为单个协议(例如,TLS1.2):
.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
您可以将协议进行逻辑或运算,因此可以通过执行以下操作同时启用TLS 1.1和1.2,并保留已启用的协议:
System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
如果您只想关闭旧的协议(如TLS1.0),同时允许其他协议(包括未来发布的协议),则可以执行以下操作: System.Net.ServicePointManager.SecurityProtocol &= ~SecurityProtocolType.Tls; 此设置可以实时进行更改,也可以放置在全局配置文件中(例如Global.asax Application_Start)。
ServicePointManager.SecurityProtocol的文档在这里
请注意,如果您必须针对 .Net4.0,则仍然可以使用上述技术来指定TLS1.2,只需在目标版本旁边安装 .Net4.5 即可。甚至可以在旧版本的框架上执行此操作,只需更新几个.dll文件即可。说明在{{link2:这里}}。
值得注意的是,根据证书配置、注册表设置和已安装的更新程序等因素,这整个过程可能会出现其他问题。
我理解您想要避免用户设置,但是浏览器设置也可能影响此行为。请参阅 MSDN 博客文章 here,该文章介绍了 Firefox 和 IE 的设置。
在客户端上,您可以在浏览器设置中检查此设置。如果您正在使用上述支持的 Windows 操作系统之一上的 IE,则在 IE 中浏览到 工具 -> Internet 选项 -> 高级选项 下,您会看到 IE 支持的 SSL 协议版本列表。IE 仅支持操作系统底层 SCHANNEL 组件支持的安全协议版本。
如果上述信息不足以解决问题,那么就该启动WireShark并直接查看TLS协商了。只需将捕获过滤器设置为“SSL”,选择要跟踪的IP地址,然后使用菜单下拉列表或键盘快捷键Ctrl-Alt-Shift-S来跟踪SSL流。您可能会发现问题实际上是在服务器端,或者可能会看到一方或另一方存在证书问题。

即使您平时不使用WireShark,这样做也非常快速,而且有很多教程可用。我喜欢Cisco网站这里的一个教程,以下是其中的简短引用,以防链接失效:

以下是 SSL 流程,可以清晰地展示整个 TLS 握手过程和公钥、证书交换的情况,直到交换对进一步加密使用的对称密钥。连接 https 时始终发生的第一件事是客户端(即您的浏览器)宣布其密码算法能力,基本上告诉您要连接到的服务器您所具备的安全算法。这在下面的屏幕截图中显示出来。

enter image description here


非常感谢。连接没有协商最高可能的TLS级别(否则它将工作)。我还尝试设置SecurityProtocolType.Tls12,但在这种情况下也无济于事。 - Dunken
@Dunken,如果您能解释一下“没有帮助”的意思,那么我可能可以提供更多的帮助。 TLS协商确实按照文档工作,所以也许您的操作系统或.net版本不支持TLS1.2?我也展示了针对这些情况的解决方法…… - Craig.Feied
@Dunken 我已经添加了关于如何在WireShark中查看协商的信息。如果这仍然无法解决问题,也许您可以发布一个小的可运行示例,以便我们观察您的问题? - Craig.Feied

0

似乎存在底层IE版本的问题。

您能确认一下用户代理吗?

同时进行testssl.sh测试。

要使用该工具,请导航至https://testssl.sh


0

正如Craig.Feied所提到的,对于XBAP应用程序,需要显式启用更高级别的安全协议。

默认情况下,即使在.NET 4.7.2下,System.Net.ServicePointManager.SecurityProtocol也设置为Ssl3和Tls作为XBAP应用程序的唯一支持协议。

要为您的XBAP应用程序启用TLS 1.1或1.2协议,请添加一个using语句以包括System.Net,并添加类似以下行:

System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

注意:标准的WinForms应用程序可以在不需要额外代码行的情况下协商TLS 1.2,但XBAP应用程序并不那么智能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接