WCF Client in .NET 4.5.1: How to enable TLS 1.2 when WebRequest is used?
我们的.NET WCF客户机webrequest调用编译为在win2012-r2上运行的Windows exe,拒绝连接到仅显示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(在Win7及更高版本上)可以很好地连接到服务器(没有任何警告或SSL问题)。
服务器证书%100正常。
问题是在这种情况下WebRequest无法连接。
我们需要在代码中设置什么,以便使用webrequest连接到可能运行tls 1.2、1.1、1.0和/或ssl v3的系统?
- 很可能,这是操作系统上启用的密码。你在使用什么操作系统?您应用了所有补丁和服务包吗?是否尝试更新到.NET 4.5.2?
- @不,对不起,你不正确。这不是密码启用的问题(在Win2012-R2上,所有密码都存在且都已启用),也不是.NET 4.51的限制,.NET 4.x中存在TLS 1.2支持。问题是如何启用它,因为默认情况下.NET本身不为1.2启用。
- 你是说它不会连接到任何站点的任何安全连接吗?
- @ErikFunkenbusch请参阅操作。问题是,直接在.NET 4.51下的win2012-r2上使用时,如果服务器仅显示TLS 1.2,则WebRequest无法连接到服务器。
- 我确实提到过这个帖子,你的帖子建议它不会连接到"TLS 1.2、1.1、1.0和/或SSL v3",我认为它不会连接到任何安全的连接。所以,我在问…它是否成功地连接到任何其他服务?此外,您没有包含任何演示您正在做什么的代码,因此很难知道您可能做错了什么。
- 另外,您确定服务器证书有效吗?您是否试图绕过证书验证来验证这是否是问题所在?你还设置了ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12吗?
- @埃里克芬肯布什道歉。操作肯定是误导了。我刚刚对手术室做了一次大的扩建。
- 一些代码将有助于诊断问题。您还可以提供完整的错误消息吗?
- 这个线程似乎有答案:stackoverflow.com/q/26389899/147637
- 我刚才问你的…谢斯。
您应该使用.NET 4.5或更高版本,并在代码中添加此行:
1
| System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; |
- 您不必触摸代码:docs.microsoft.com/en-us/officeonlineserver/…
- 您的代码正在清除SecurityProtocol中的任何值,只留下tls1.2。某些Web服务可能仍在TLS1.1上。要添加TLS1.2作为可能的选项,请使用|=more detail ryadel.com/en/…
虽然不容易理解,但需要的属性是:
System.Net.ServicePointManager.SecurityProtocol
这可用于禁用和启用WCF环境中的TLS级别。
此外,您还可以看到当前使用的wcf设置为:
1
| Console.WriteLine(System.Net.ServicePointManager.SecurityProtocol.ToString()); |
感谢:如何禁用SSL回退并仅对.NET中的出站连接使用TLS?(减轻狮子狗)
- Windows服务器版本是否与修复程序相关,或者在适当设置System.Net.ServicePointManager.SecurityProtocol的情况下,它是否在不考虑Windows版本的情况下工作?
- @mmcrae Windows版本与以下程度相关:如果操作系统本身不支持TLS 1.2(通过schannel dll),那么在.NET中请求它将不会给您…参见blogs.msdn.microsoft.com/kaushal/2011/10/02/…
- 虽然这个答案是正确的,但它设置了一个程序范围的设置。如果我想在同一个程序中对不同的服务调用使用不同的协议怎么办?
- @Esko你不能,这是唯一可能的设置,.NET框架明显的设计缺陷。此线程显示问题并提出解决方案。当然,微软已经仔细地忽略了这个问题。
重要的是,你至少应该从.Net Framework v4.5开始。旧版本不支持TSL 1.2。稍后,在对服务器进行身份验证时,显式使用此协议:
1
| sslStream.AuthenticateAsClient(this._configuration.Host, null, SslProtocols.Tls12, true); |