【问题标题】:WCF Client in .NET 4.5.1: How to enable TLS 1.2 when WebRequest is used?.NET 4.5.1 中的 WCF 客户端:使用 WebRequest 时如何启用 TLS 1.2?
【发布时间】:2015-06-22 05:24:35
【问题描述】:

我们的 .net WCF 客户端,WebRequest 调用,编译为 Windows EXE,在 Win2012-R2 上运行,拒绝连接到仅显示 TLS 1.2 的 Web 服务器

我们知道 Win2012 和 .NET 4.5x 支持 TLS 1.2

当服务器显示 TLS 1.0 及更高版本时,我们没有问题。只有当我们连接的服务器禁用 TLS 1.0、1.1 和 SSL2 和 SSL3 时,才会出现问题。服务器仅显示 TLS 1.2。 Chrome 和 firefox(在 Win 7 和更高版本上)可以很好地连接到服务器(没有任何警告或 SSL 问题)。

服务器证书是 %100 OK。

问题是在这种情况下WebRequest无法连接。

我们需要在代码中设置什么,以便我们使用 WebRequest 连接到可能运行 TLS 1.2、1.1、1.0 和/或 SSL v3 的系统?

【问题讨论】:

  • 很可能,这是操作系统上启用的密码。您使用的是什么操作系统?您是否应用了所有补丁和服务包?您是否尝试更新到 .NET 4.5.2?
  • @ErikFunkenbusch 不,抱歉,您不正确。这不是密码启用的问题(在 Win2012-R2 上,所有密码都存在并且全部启用。)也不是 .NET 4.51 的限制,.NET 4.x 中存在 TLS 1.2 支持。问题是如何启用它,因为 .NET 本身在默认情况下没有为 1.2 启用。
  • 你是说它不会连接到任何网站的任何安全连接?
  • @ErikFunkenbusch 请参阅 OP。问题是,如果服务器仅显示 TLS 1.2,则直接在 .NET 4.51 下的 Win2012-R2 上使用 WebRequest 时无法连接到服务器
  • 另外,您确定服务器证书有效吗?您是否尝试过绕过证书验证来验证这是否是问题所在?你也设置了ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12吗?

标签: .net wcf


【解决方案1】:

您应该使用 .NET 4.5 或更高版本并在您的代码中添加此行:

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

【讨论】:

【解决方案2】:

虽然不容易弄清楚,但需要的属性是:

System.Net.ServicePointManager.SecurityProtocol

这可用于在 WCF 环境中禁用和启用 TLS 级别。

此外,您还可以查看 WCF 当前设置使用的内容:

Console.WriteLine(System.Net.ServicePointManager.SecurityProtocol.ToString());

感谢: How do I disable SSL fallback and use only TLS for outbound connections in .NET? (Poodle mitigation)

【讨论】:

  • Windows 服务器版本是否与修复相关,或者只要您正确设置 System.Net.ServicePointManager.SecurityProtocol,无论您的 Windows 版本如何,它都可以工作吗?
  • @mmcrae Windows 版本与如果操作系统本身不支持 TLS 1.2(通过 schannel dll)的程度相关,那么在 .NET 中请求它不会给你。 .. 见blogs.msdn.microsoft.com/kaushal/2011/10/02/…
  • 虽然这个答案是正确的,但它设置了程序范围的设置。如果我想在同一个程序中对不同的服务调用使用不同的协议怎么办?
  • @Esko 你不能,这是唯一可能的设置,.NET Framework 的明显设计缺陷。 This thread 显示问题并提出解决方案。微软,当然是has carefully ignored the problem。
【解决方案3】:

重要的是,您至少应该以.Net Framework v4.5 开头。旧版本不支持TSL 1.2。稍后,在向服务器进行身份验证时显式使用此协议:

    sslStream.AuthenticateAsClient(this._configuration.Host, null, SslProtocols.Tls12, true);

【讨论】:

    猜你喜欢
    • 2018-10-31
    • 2016-04-27
    • 1970-01-01
    • 2020-05-03
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    相关资源
    最近更新 更多