Diferentes validações de certificado entre segurança de SOAP, HTTPS, SSL através de TCP

Você pode usar certificados no WCF (Windows Communication Foundation) com a segurança de camada de mensagem (SOAP), além do protocolo TLS via HTTP (HTTPS) ou TCP. Este tópico descreve as diferenças na forma como esses certificados são validados.

Validação de certificados de cliente HTTPS

Ao usar HTTPS para se comunicar entre um cliente e um serviço, o certificado que o cliente usa para se autenticar no serviço precisa dar suporte à relação de confiança da cadeia. Ou seja, ele precisa ser encadeado a uma autoridade de certificado raiz confiável. Caso contrário, a camada HTTP gera uma WebException com a mensagem "O servidor remoto retornou um erro: (403) Proibido". O WCF apresenta essa exceção como uma MessageSecurityException.

Validação de certificados de serviço HTTPS

Ao usar HTTPS para se comunicar entre um cliente e um serviço, o certificado com o qual o servidor se autentica precisa dar suporte à relação de confiança da cadeia por padrão. Ou seja, ele precisa ser encadeado a uma autoridade de certificado raiz confiável. Nenhuma verificação online é executada para ver se o certificado foi revogado. Você pode substituir esse comportamento registrando um retorno de chamada RemoteCertificateValidationCallback, conforme mostrado no código a seguir.

ServicePointManager.ServerCertificateValidationCallback +=
    new RemoteCertificateValidationCallback(ValidateServerCertificate);
ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf ValidateServerCertificate)

em que a assinatura de ValidateServerCertificate é a seguinte:

public static bool ValidateServerCertificate(
  object sender,
  X509Certificate certificate,
  X509Chain chain,
  SslPolicyErrors sslPolicyErrors)
Public Shared Function ValidateServerCertificate(ByVal sender As Object, _
                                                 ByVal certificate As X509Certificate, _
                                                 ByVal chain As X509Chain, _
                                                 ByVal sslPolicyErrors As SslPolicyErrors) As Boolean

A implementação de ValidateServerCertificate pode executar todas as verificações que o desenvolvedor do aplicativo cliente considera necessárias para validar o certificado de serviço.

Validação de certificados do cliente em SSL via TCP ou Segurança SOAP

Ao usar o protocolo SSL via TCP ou segurança de mensagem (SOAP), os certificados do cliente são validados de acordo com o valor da propriedade CertificateValidationMode da classe X509ClientCertificateAuthentication. A propriedade não é definida como um dos valores X509CertificateValidationMode. A verificação de revogação é executada de acordo com os valores do valor da propriedade RevocationMode da classe X509ClientCertificateAuthentication. A propriedade não é definida como um dos valores X509RevocationMode.

myServiceHost.Credentials.ClientCertificate.Authentication.
    CertificateValidationMode=
    X509CertificateValidationMode.PeerOrChainTrust;

myServiceHost.Credentials.ClientCertificate.Authentication.
    RevocationMode=X509RevocationMode.Offline;
With myServiceHost.Credentials.ClientCertificate.Authentication
    .CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust
    .RevocationMode = X509RevocationMode.Offline
End With

Validação do certificado de serviço no SSL via TCP e Segurança SOAP

Ao usar o SSL via TCP ou segurança da mensagem (SOAP), os certificados de serviço são validados de acordo com o valor da propriedade CertificateValidationMode da classe X509ServiceCertificateAuthentication. A propriedade não é definida como um dos valores X509CertificateValidationMode.

A verificação de revogação é executada de acordo com os valores do valor da propriedade RevocationMode da classe X509ServiceCertificateAuthentication. A propriedade não é definida como um dos valores X509RevocationMode.

myClient.ClientCredentials.ServiceCertificate.
    Authentication.CertificateValidationMode=
    X509CertificateValidationMode.PeerOrChainTrust;
myClient.ClientCredentials.ServiceCertificate.Authentication.
    RevocationMode = X509RevocationMode.Offline;
With myClient.ClientCredentials.ServiceCertificate.Authentication
    .CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust
    .RevocationMode = X509RevocationMode.Offline
End With

Confira também