Erro de comunicação com servidor ao configurar CRM cliente: “The client and server cannot communicate, because they do not possess a common algorithm”
Revisando o seguinte artigo, notamos que existem vulnerabilidades públicas para o protocolo TLS 1.0/SSL 3.0:
TLS/SSL Security Considerations
Sendo assim, algumas empresas adotaram a pratica de desativar o protocolo TLS 1.0/SSL 3.0, de forma explicita, no sistema operacional.
Basicamente é preciso atuar com chaves e subchaves em HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols.
Mais detalhes no artigo:
TLS/SSL Settings
Entretanto, ao desativar o protocolo TLS 1.0/SSL 3.0, enfrenta-se dificuldades para configurar o Microsoft Dynamics CRM for Outlook no ambiente Dynamics CRM On-Premises (publicado com IFD) ou Dynamics CRM Online.
Característica comum é que a credencial não chega a ser solicitada.
Mensagem de erro na interface de usuário:
Há um problema na comunicação com o servidor do Microsoft Dynamics CRM. Talvez esse servidor não esteja disponível. Tente novamente mais tarde. Se o problema persistir, contate o administrador do sistema.
Mensagem de erro nos logs do CRM for Outlook:
Error connecting to URL: {0} Exception: {1}| https://crm.contoso.com/XRMServices/2011/Discovery.svc, System.InvalidOperationException: Metadata contains a reference that cannot be resolved: 'https://crm.contoso.com/XRMServices/2011/Discovery.svc?wsdl&sdkversion=7.1'. ---> System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a receive. ---> System.ComponentModel.Win32Exception: The client and server cannot communicate, because they do not possess a common algorithm
at System.Net.SSPIWrapper.AcquireCredentialsHandle(SSPIInterface SecModule, String package, CredentialUse intent, SecureCredential scc)
at System.Net.Security.SecureChannel.AcquireCredentialsHandle(CredentialUse credUsage, SecureCredential& secureCredential)
at System.Net.Security.SecureChannel.AcquireClientCredentials(Byte[]& thumbPrint)
at System.Net.Security.SecureChannel.GenerateToken(Byte[] input, Int32 offset, Int32 count, Byte[]& output)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result)
at System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.ConnectStream.WriteHeaders(Boolean async)
--- End of inner exception stack trace ---
at System.Net.HttpWebRequest.GetResponse()
at System.ServiceModel.Description.MetadataExchangeClient.MetadataLocationRetriever.DownloadMetadata(TimeoutHelper timeoutHelper)
at System.ServiceModel.Description.MetadataExchangeClient.MetadataRetriever.Retrieve(TimeoutHelper timeoutHelper)
--- End of inner exception stack trace ---
at System.ServiceModel.Description.MetadataExchangeClient.MetadataRetriever.Retrieve(TimeoutHelper timeoutHelper)
at System.ServiceModel.Description.MetadataExchangeClient.ResolveNext(ResolveCallState resolveCallState)
at System.ServiceModel.Description.MetadataExchangeClient.GetMetadata(MetadataRetriever retriever)
at Microsoft.Xrm.Sdk.Client.ServiceMetadataUtility.RetrieveServiceEndpointMetadata(Type contractType, Uri serviceUri, Boolean checkForSecondary)
at Microsoft.Xrm.Sdk.Client.ServiceConfiguration`1..ctor(Uri serviceUri, Boolean checkForSecondary)
at Microsoft.Xrm.Sdk.Client.ServiceConfigurationFactory.CreateConfiguration[TService](Uri serviceUri, Boolean enableProxyTypes, Assembly assembly)
at Microsoft.Crm.Outlook.ClientAuth.ClientAuthProvidersFactory`1.DiscoverAuthUsingServiceMetadata(Uri endPoint, Uri webEndPoint)
at Microsoft.Crm.Outlook.ClientAuth.ClientAuthProvidersFactory`1.GetAuthProviderForDeployment(Uri endPoint, Uri webEndPoint)
at Microsoft.Crm.Application.Outlook.Config.DeploymentsInfo`1.DeploymentInfo`1.ValidateAuthProvider()
at Microsoft.Crm.Application.Outlook.Config.DeploymentsInfo`1.SortAndValidateDeployments()4Error| Exception : The underlying connection was closed: An unexpected error occurred on a receive. at System.Net.HttpWebRequest.GetResponse()
at System.ServiceModel.Description.MetadataExchangeClient.MetadataLocationRetriever.DownloadMetadata(TimeoutHelper timeoutHelper)
at System.ServiceModel.Description.MetadataExchangeClient.MetadataRetriever.Retrieve(TimeoutHelper timeoutHelper)
Observamos que o método com problemas (AcquireCredentialsHandle) vem a partir do .Net Framework (System.Net)
Este comportamento é explicado pelo fato do Microsoft .NET Framework ter protocolo padrão SSL/TLS como TLS 1.0 | SSL 3.0.
Para solucionar o problema, deve-se aplicar o update de segurança para .NET Framework, conforme descrito nos artigos:
Microsoft security advisory: Vulnerability in the .NET Framework: May 13, 2014
https://support.microsoft.com/en-us/kb/2960358
Microsoft Security Advisory 2960358
https://technet.microsoft.com/en-us/library/security/2960358
Este update poderá ser aplicado de forma manual, através de chaves de registro:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319
"SchUseStrongCrypto"=dword:00000001
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319
"SchUseStrongCrypto"=dword:00000001
Basicamente este update irá alterar o protocolo padrão SSL/TLS de TLS 1.0/SSL 3.0 para TLS 1.2/TLS 1.1/TLS 1.0.
Pontos relevantes para artigo do update de segurança para .NET Framework:
Microsoft Security Advisory 2960358
https://technet.microsoft.com/en-us/library/security/2960358
Existem pré-requisitos para instalar as atualizações abordadas neste aviso?
Sim. A pré-instalação da atualização 2868725, lançada em novembro de 2013, é um pré-requisito para instalar as atualizações abordadas neste aviso, com exceção das atualizações que se aplicam ao Windows 8.1, Windows Server 2012 R2 e Windows RT 8.1. Para obter mais informações sobre a atualização de pré-requisito, consulte o Artigo 2868725 (em inglês) da Microsoft Knowledge Base.
As atualizações estão disponíveis no Windows Update?
Não. Como as atualizações podem afetar a compatibilidade com aplicativos e serviços existentes ao desativar a cifra RC4 não protegida, a Microsoft está fornecendo as atualizações somente quando solicitadas (somente através do Centro de Download da Microsoft e do Catálogo do Microsoft Update). As atualizações não estão sendo fornecidas via Windows Update para que os clientes possam planejar e testar as novas configurações e desabilitar o RC4 antes da implementação em seus ambientes.
Qual é o escopo do comunicado?
O objetivo deste comunicado é notificar os clientes de que há uma atualização disponível para o Microsoft .NET Framework que desativa RC4 no protocolo TLS e que também altera o protocolo padrão SSL/TLS de TLS 1.0 | SSL 3.0 para TLS 1.2 | TLS 1.1 | TLS 1.0 se você está executando um aplicativo .NET no tempo de execução .NET 4.5 ou superior.
Para que um atacante pode usar a vulnerabilidade?
O uso do RC4 no TLS pode permitir que um atacante execute ataques a intermediários e recupere texto sem formatação de sessões criptografadas.
O que é um ataque de intermediário?
Um ataque de intermediário ocorre quando um atacante desvia a comunicação entre dois usuários pelo computador do atacante, sem o conhecimento dos dois usuários que se comunicam. Cada usuário na comunicação, sem saber, envia e recebe tráfego do atacante, achando que está se comunicando somente com o usuário pretendido.
O que a atualização faz?
A atualização aceita a remoção do RC4 como uma criptografia disponível em sistemas afetados por configurações do registro. A Microsoft recomenda que os clientes testem todas as configurações novas para desabilitar o RC4 antes de implementá-las em seus ambientes.
O que é TLS?
TLS (Transport Layer Security) é um protocolo padrão usado para fornecer comunicações seguras pela Web na Internet ou em intranets. Ele permite que os clientes autentiquem servidores ou que os servidores autentiquem clientes. Ele também fornece um canal seguro criptografando as comunicações. TLS é o sucessor do protocolo SSL (Secure Sockets Layer).
O que é RC4?
RC4 é uma cifra de fluxo usada na criptografia e na descriptografia.
Outros artigos interessantes:
TLS/SSL Settings
https://technet.microsoft.com/en-us/library/dn786418.aspx
TLS/SSL and .NET Framework 4.0
https://www.simple-talk.com/dotnet/.net-framework/tlsssl-and-.net-framework-4.0
Using TLS 1.2 with WCF
https://blogs.msdn.com/b/benjaminperkins/archive/2014/11/04/using-tls-1-2-with-wcf.aspx
Support for SSL/TLS protocols on Windows
https://blogs.msdn.com/b/kaushal/archive/2011/10/02/support-for-ssl-tls-protocols-on-windows.aspx
Fiddler and Modern TLS Versions
https://www.telerik.com/blogs/fiddler-and-modern-tls-versions