我遇到.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。没有其他协议可以连接。
Works(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>