一个服务器已经禁用了TLS 1.0/1.1。客户端是在Internet Explorer中运行的XBAP应用程序。看起来PresentationHost试图建立一个TLS 1.0连接,但由于服务器拒绝它而失败。我能否以某种方式强制(例如通过编程或配置文件)PresentationHost使用TLS 1.2?我知道可以相应地设置客户端的注册表(将SchUseStrongCrypto设置为1),但我希望避免用户配置任何内容。
System.Net.ServicePointManager.SecurityProtocol &= ~SecurityProtocolType.Tls;
此设置可以实时进行更改,也可以放置在全局配置文件中(例如Global.asax Application_Start)。Ctrl-Alt-Shift-S
来跟踪SSL流。您可能会发现问题实际上是在服务器端,或者可能会看到一方或另一方存在证书问题。
即使您平时不使用WireShark,这样做也非常快速,而且有很多教程可用。我喜欢Cisco网站这里的一个教程,以下是其中的简短引用,以防链接失效:
以下是 SSL 流程,可以清晰地展示整个 TLS 握手过程和公钥、证书交换的情况,直到交换对进一步加密使用的对称密钥。连接 https 时始终发生的第一件事是客户端(即您的浏览器)宣布其密码算法能力,基本上告诉您要连接到的服务器您所具备的安全算法。这在下面的屏幕截图中显示出来。正如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应用程序并不那么智能。
SecurityProtocolType.Tls12
,但在这种情况下也无济于事。 - Dunken