.NET 4.5.1 中的 WCF 客户端:使用 WebRequest 时如何启用 TLS 1.2?

Posted

技术标签:

【中文标题】.NET 4.5.1 中的 WCF 客户端:使用 WebRequest 时如何启用 TLS 1.2?【英文标题】:WCF Client in .NET 4.5.1: How to enable TLS 1.2 when WebRequest is used? 【发布时间】: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吗? 【参考方案1】:

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

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

【讨论】:

您不必触摸代码:docs.microsoft.com/en-us/officeonlineserver/… 您的代码正在清除 SecurityProtocol 中 曾经 的任何值,而只留下 TLS1.2。某些 Web 服务可能仍在 TLS1.1 上。要添加 TLS1.2 作为可能的选项,以及其他选项,请使用 |= 更多详细信息 ryadel.com/en/…【参考方案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);

【讨论】:

以上是关于.NET 4.5.1 中的 WCF 客户端:使用 WebRequest 时如何启用 TLS 1.2?的主要内容,如果未能解决你的问题,请参考以下文章

.Net Core 中的 WCF 替换

如何解决 .NET Core 客户端应用程序中的 WS2007HttpBinding WCF 服务绑定

WCF 服务中的 SignalR 用于更新网站客户端

有没有办法让客户端连接到现有的 WCF Web Http 服务而不使用 .Net Core 2 中的 WebHttpBinding?

asp.net core 2.0 中的 WCF - 无法为具有权限的 SSL/TLS 安全通道建立信任关系

WCF net.tcp 服务和 SQL Server 中的存储程序集