WCF Exception Could not establish trust relationship with remote server


Ao acessar no Chrome o endereço de um webservice que esteja com o certificado SSL inválido você receberá um alerta de segurança como:

Erro SSL - Google Chrome

Mensagem exibida no Chrome:

Ao tentar acessar dados desse webservice através do WCF será retornada a seguinte exception:

Provavelmente o arquivo de config do seu projeto tem uma entrada de configuração desse webservice semelhante a essa:

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding name="TesteWebserviceServiceSoap" />
  </bindings>
  <client>
    <endpoint address="https://TesteWebservice.com.br" binding="basicHttpBinding" bindingConfiguration="TesteWebserviceServiceSoap" contract="TesteWebserviceWebservice.TesteWebserviceServiceSoap" name="TesteWebserviceServiceSoap" />
  </client>
</system.serviceModel>

E o código de chamada do webservice será parecido com esse:

TesteWebservice.TesteWebserviceClient ws = new TesteWebservice.TesteWebserviceClient();
ws.Teste();

Para que o erro do certificado seja ignorado e qualquer certificado seja aceito, você deve alterar a entrada do web.config da seguinte forma:

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding name="TesteWebserviceServiceSoap">
        <security mode="Transport">
          <transport clientCredentialType="None" />
        </security>
      </binding>
  </bindings>
  <client>
    <endpoint address="https://TesteWebservice.com.br" binding="basicHttpBinding" bindingConfiguration="TesteWebserviceServiceSoap" contract="TesteWebserviceWebservice.TesteWebserviceServiceSoap" name="TesteWebserviceServiceSoap" />
  </client>
</system.serviceModel>

E adicionar o seguinte código em algum ponto da sua aplicação que seja executado antes da chamada do webservice:

ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(TrustAllCertificates);

public static bool TrustAllCertificates(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    return true; //Retorna que todos os certificados são válidos
}

Comentários