Dynamics CRM:强制执行TLS 1.2后出现WCF安全错误

时间:2019-09-25 16:02:41

标签: c# wcf dynamics-crm wcf-binding wcf-security

我们已将功能性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

2 个答案:

答案 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;

我们可以使用Wireshark检查实用的TLS版本。 enter image description here
随时让我知道是否有什么可以帮助您的。