【问题标题】:Force PresentationHost to use TLS 1.2强制 PresentationHost 使用 TLS 1.2
【发布时间】:2018-10-17 15:57:02
【问题描述】:

服务器已禁用 TLS 1.0/1.1。客户端是在 Internet Explorer 中运行的 XBAP 应用程序。看起来 PresentationHost 尝试建立 TLS 1.0 连接但由于服务器拒绝而失败。我可以以某种方式强制(例如以编程方式或配置文件)PresentationHost 使用 TLS 1.2?我知道可以相应地设置客户端的注册表(将SchUseStrongCrypto 设置为 1),但我想避免用户进行任何配置。

【问题讨论】:

    标签: tls1.2 xbap


    【解决方案1】:

    一般来说,我希望客户端协商支持和启用的最高 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)。操作系统版本支持的协议版本列表为here

    如果 .Net 的目标版本操作系统版本都支持 TLS1.2,那么您应该能够通过设置 ServicePointManager 安全协议类型来强制连接只接受 TLS1.2。 要将其限制为单一协议(例如 TLS1.2),只需在进行网络调用之前进行设置:

    .Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

    您可以将OR 协议放在一起,这样您就可以启用 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 的文档是here

    为了完整起见,我注意到如果您必须以 .Net4.0 为目标,您仍然可以使用上述技术来指定 TLS1.2,前提是您只需将 .Net4.5 与目标版本一起安装。如果您更新几个 .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 连接时总是发生的第一件事是 客户端(您的浏览器)宣布其密码功能,它基本上 告诉服务器您连接到什么安全算法 有能力。这显示在下面的屏幕截图中

    【讨论】:

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

    似乎是底层 IE 版本的问题。

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

    执行一个testssl.sh。

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

    【讨论】:

      【解决方案3】:

      正如 Craig.Feied 所说,有必要为 XBAP 应用程序显式启用更高级别的安全协议。

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

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

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

      注意:标准 WinForms 应用程序将协商 TLS 1.2,而不需要额外的代码行,但 XBAP 应用程序并不那么智能

      【讨论】:

        猜你喜欢
        • 2023-03-29
        • 2018-12-10
        • 2021-12-20
        • 1970-01-01
        • 2020-06-09
        • 2018-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多