Dynamics CRM: ошибка безопасности WCF после форсирования TLS 1.2 - PullRequest
0 голосов
/ 25 сентября 2019

У нас есть функциональное подключение WCF к нашей Dynamics CRM (локальная версия 2016).Недавно нам нужно было удалить SSL 2.0 / 3.0 и TLS 1.0 / 1.1 на сервере Dynamics для соответствия требованиям (принудительно 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

Обновление

Я попробовал следующую конфигурацию system.serviceModelв web.config клиентского приложения, вызывающего приложение WCF, и я получаю следующую ошибку:

Объект связи, 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>

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

Во-первых, ваше клиентское соединение не настраивает адрес службы Https должным образом.

<binding name="BasicHttpBinding_IWCFService" 

bindingConfiguration="BasicHttpBinding_IFWCFService"

Кроме того, основываясь на рекомендациях TLS с Dotnet Framework.
https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls
мы должныне вмешиваться в решение базовой версии TLS.

Не указывать версию TLS.Сконфигурируйте свой код, чтобы позволить ОС выбирать версию TLS.

Согласно вашему описанию, для обеспечения связи TLS1.2 через HTTPS нам следует обновить версию Dotnetframework SDK до версии 4.6.1 и выше.прежде чем мы настроим конечную точку службы HTTPS на стороне сервера.
Затем на стороне клиента мы также установим Dotnetframework4.6 выше.И укажите версию TLS, используя следующий код, прежде чем звонить на сервер.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

Мы могли бы проверить практическую версию TLS, используя Wireshark.enter image description here
Не стесняйтесь, дайте мне знать, если я могу чем-то помочь.

0 голосов
/ 25 сентября 2019

Согласно документации Microsoft: Рекомендации по обеспечению безопасности транспортного уровня (TLS) с использованием .NET Framework

Для WCF с использованием .NET Framework 3.5 - 4.5.2 с использованием безопасности транспорта TCP с учетными данными сертификата

Эти версии инфраструктуры WCF жестко заданы для использования значений SSL 3.0 и TLS 1.0.Эти значения не могут быть изменены.Чтобы использовать TLS 1.1 и 1.2, необходимо обновить и перенастроить NET Framework 4.6 или более поздние версии.

Похоже, вам может потребоваться обновить службы WCF до .NET Framework до 4.6.2 или выше.

...