我遇到了 .NET 服务引用连接的问题。我们正在从 .NET v 4.5 迁移到 v 4.6.2。默认的 SecurityProtocol 发生了变化。
v 4.5 默认使用 SSL3 和 TLS 1.0,但 v 4.6+ 默认使用 TLS 1.0、TLS 1.1 和 TLS 1.2。
连接到大多数服务时,SSL3 被禁用。该行为似乎是它首先尝试的最高 SecurityProtocol。如果这失败了,那么客户端通常会沿着链向下移动到下一个级别。
对于 Web 服务上的这个特定服务器,似乎如果第一个协议不是正确的协议,那么它不会在指定协议列表中向下移动。
我已经确定该服务仅支持 TLS 1.0。没有其他协议将连接。
作品(v 4.5的默认值):
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls;
也有效(在代码中设置自定义):
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
失败:
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
失败:
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11
失败:
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
失败:
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
不幸的是,安全协议似乎是在应用程序域级别指定的。我还有其他需要 TLS 1.2 的服务。此特定服务仅适用于 TLS 1.0。
有没有人有一个解决方案:
A) 仅允许该服务仅使用 TLS 1.0,同时将其他 SecurityProtocol 值保留为 v 4.6.2 的默认值,TLS 1.0、1.1 和 1.2 可用,
或者
B)建议维护服务的管理员可能会做些什么来重新配置服务的服务器以正确协商?Web 服务也是一个 WCF .NET 应用程序,但应用程序代码和服务器不在我的控制之下。
谢谢!
更新:
我已经确认在服务器上具有此 WCF 的服务器和 IIS 将通过 TLS 1.2 加载网页。
用于测试的不同服务器/IIS 上的 Web 服务副本不存在此问题(尽管测试与实时应用程序可能存在一些差异,因为我不控制它们或不知道它们的代码)。
我们正在使用以下绑定连接到 WCF。
<basicHttpBinding>
<binding name="ClientCertAuthBindingEndPoint" closeTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
<security mode="Transport">
<transport clientCredentialType="Certificate" />
</security>
</binding>
<binding name="ClientCertAuthBindingEndPoint1" closeTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
<security mode="Transport">
<transport clientCredentialType="Certificate" />
</security>
</binding>
<binding name="CmreServiceSoap">
<security mode="Transport" />
</binding>
</basicHttpBinding>