服务器已禁用TLS 1.0 / 1.1。客户端是在Internet Explorer中运行的XBAP应用程序。看起来PresentationHost试图建立TLS 1.0连接,但由于服务器拒绝而失败。我可以以某种方式强制(例如以编程方式或配置文件)PresentationHost使用TLS 1.2吗?我知道可以相应地设置客户端的注册表(将SchUseStrongCrypto
设置为1),但是我想避免用户配置任何东西。
答案 0 :(得分: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时)。
早期版本的框架版本可能默认为特定的协议类型,而与操作系统默认设置无关。在大多数情况下,如果启用它们,他们仍应尝试其他协议。
如果您看到的行为不是您想要的,那么第一件事就是确保目标框架版本和OS版本都能够支持您要启用的安全协议类型(例如TLS 1.2)。操作系统版本支持的协议版本列表为here。
如果.Net 和的目标版本都支持TLS1.2,那么您应该能够通过设置ServicePointManager安全协议类型来强制连接仅接受TLS1.2。 要将其限制为单个协议(例如TLS1.2),只需在进行网络通话之前进行设置即可:
.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
您可以OR
一起使用协议,因此可以通过执行以下操作来启用TLS 1.1和1.2,同时保持已启用的TLS:
System.Net.ServicePointManager.SecurityProtocol |=
SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
如果您只想在允许其他协议(包括将来的版本)的同时关闭TLS1.0等较旧的协议,则可以执行以下操作:
System.Net.ServicePointManager.SecurityProtocol &= ~SecurityProtocolType.Tls;
您可以随时进行设置,也可以将其放入诸如Global.asax Application_Start之类的全局配置中。
ServicePointManager.SecurityProtocol的文档为here。
为完整性起见,我注意到,如果您必须以.Net4.0为目标,则只需在目标版本旁边安装.Net4.5,仍然可以使用上述技术来指定TLS1.2。如果您更新几个.dll文件,则甚至可能使用较旧版本的框架执行此操作。说明是here。
值得注意的是,根据证书配置,注册表设置和安装的更新,整个事情还可能以其他方式失败。
我了解您想远离用户设置,但是有些浏览器设置也可能会影响此行为。请参阅MSDN博客文章here,其中介绍了Firefox和IE的设置。
在客户端,您可以在浏览器设置中进行检查。如果你 在上面列出的任何受支持的Windows操作系统上使用IE,然后在 IE,浏览至工具-> Internet选项->高级。在下面 在“安全”部分,您会看到受支持的SSL协议列表 IE浏览器IE仅支持那些安全协议版本,即 由操作系统的基础SCHANNEL组件支持。
编辑:
如果以上信息不足以解决问题,那么该启动WireShark并直接查看TLS协商了。只需将捕获过滤器设置为“ SSL”,选择要跟踪的IP地址,然后使用菜单下拉菜单或键盘快捷键Ctrl-Alt-Shift-S
即可跟踪SSL流。您可能会发现问题毕竟出在服务器端,或者您可能会在一侧或另一侧看到证书问题。
即使您通常不使用WireShark,执行此操作也非常快,并且有许多可用的教程。我喜欢cisco网站here上的一个,如果链接消失了,我会简要地引用一下:
跟随ssl流可以使您清楚地了解整个情况 TLS握手和公钥交换,证书最高可达 对称密钥用于进一步加密。
...使用https连接时总是发生的第一件事是 客户端(您的浏览器)宣布其密码功能,基本上 告诉服务器您要连接到哪种安全算法 有能力。显示在下面的屏幕截图中
答案 1 :(得分:0)
答案 2 :(得分: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应用程序并不那么聪明