我们已将功能性WCF连接到我们的Dynamics CRM(2016年内部部署)。我们最近需要在Dynamics服务器上删除SSL 2.0 / 3.0和TLS 1.0 / 1.1,以符合法规要求(强制使用TLS 1.2)。这中断了我们的WCF连接。我们将看到以下错误:
System.InvalidOperationException:元数据包含一个引用,该引用 无法解决: 'https://DynamicsURL.com/OrgName/XRMServices/2011/Organization.svc?wsdl'。 ---> System.Net.WebException:基础连接已关闭:发送时发生意外错误。 ---> System.IO.IOException: 无法从传输连接中读取数据:现有 远程主机强行关闭了连接。 -> System.Net.Sockets.SocketException:现有连接 被远程主机强行关闭
我没有配置它,并且没有代码导出,但是据我所知,连接安全性完全在web.config中,需要进行调整。看起来像这样:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IWCFService" sendTimeout="00:25:00" maxReceivedMessageSize="1000000">
<security mode="Transport">
<transport clientCredentialType="None" proxyCredentialType="None" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://DynamicsURL.com:8080/WCF/wcfservice.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IFWCFService" contract="WCF.IWCFService" name="BasicHttpBinding_IWCFService" />
</client>
</system.serviceModel
在实施以下更改后问题开始出现:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\Multi-Protocol Unified Hello\Client]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\Multi-Protocol Unified Hello\Server]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\PCT 1.0]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\PCT 1.0\Client]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\PCT 1.0\Server]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client]
"DisabledByDefault"=dword:00000001
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server]
"Enabled"=dword:00000000
"DisabledByDefault"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
"Enabled"=dword:ffffffff
"DisabledByDefault"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
"Enabled"=dword:ffffffff
"DisabledByDefault"=dword:00000000
更新
我在调用WCF应用程序的客户端应用程序的web.config中尝试了以下system.serviceModel配置,并且收到以下错误消息:
通信对象System.ServiceModel.Channels.ServiceChannel由于处于故障状态,因此无法用于通信。
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="BasicHttpBinding_IWCFService">
<security mode="Transport">
<transport clientCredentialType="Basic" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="https://DynamicsURL.com:8080/WCF/WCFService.svc"
binding="wsHttpBinding"
bindingConfiguration="BasicHttpBinding_IWCFService"
contract="WCF.IWCFService"
name="BasicHttpBinding_IWCFService" />
</client>
</system.serviceModel>
更新3
如下所述,我通过添加如下所示的Reg值解决了该问题。但是,即时通讯现在面临其他问题。我使用SSLLabs扫描我的网站,并获得了B分。解决方案是启用并喜欢 TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 和 TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 削片机。这样做导致SSLLabs抱怨DH,因此我将其设置为2048。现在看来一切都很好,但是我被Schannel
错误(如下)所打击。我发现了一些启用 Use FIPS < / strong>安全设置,但是当我这样做时,它破坏了我在该计算机上运行的许多功能(Dynamics CRM插件)。例如,该插件将因以下错误而失败:Error Occurred in Plugin NameRemoved exception: This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms.
其他建议是删除 TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 和 TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 削片机,但是我不能为分级而删除它。到目前为止,除错误外,一切似乎都可以正常运行。
错误
已生成致命警报,并将其发送到远程端点。这可能会导致连接终止。 TLS协议定义的致命错误代码为20。WindowsSChannel错误状态为960。
创建SSL客户端凭据时发生致命错误。的 内部错误状态为10013。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v2.0.50727]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v2.0.50727]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.5.1]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.5.23026]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v2.0.50727]
"SystemDefaultTlsVersions"=dword:00000001
答案 0 :(得分:0)
根据Microsoft文档:Transport Layer Security (TLS) best practices with the .NET Framework
对于使用.NET Framework 3.5-4.5.2且使用带有证书凭据的TCP传输安全性的WCF
这些版本的WCF框架经过硬编码,以使用值SSL 3.0和TLS 1.0。这些值不能更改。您必须更新并重新定位到NET Framework 4.6或更高版本,才能使用TLS 1.1和1.2。
看起来您可能需要将WCF服务升级到.NET Framework到4.6.2或更高版本。
答案 1 :(得分:0)
首先,您的客户端连接未正确配置Https服务地址。
<binding name="BasicHttpBinding_IWCFService"
bindingConfiguration="BasicHttpBinding_IFWCFService"
此外,基于Dotnet Framework的TLS最佳做法。
https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls
我们不应干扰底层TLS版本的决定。
不指定TLS版本。配置您的代码以使操作系统 确定TLS版本。
根据您的描述,为了在HTTPS上实现TLS1.2通信,我们应该在服务器端配置HTTPS服务终结点之前将Dotnetframework SDK版本升级到4.6.1。 然后在客户端,我们也安装了上面的Dotnetframework4.6。并在调用服务器之前使用以下代码指定TLS版本。
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;