Differenze di convalida dei certificati tra HTTPS, SSL su TCP e sicurezza SOAP

È possibile usare i certificati in Windows Communication Foundation (WCF) con sicurezza SOAP (Message Layer) oltre alla sicurezza tls (Transport Layer Security) su HTTP (HTTPS) o TCP. In questo argomento vengono descritte le differenze nel modo in cui tali certificati vengono convalidati.

Convalida dei certificati client HTTPS

Quando si usa HTTPS per comunicare tra un client e un servizio, il certificato usato dal client per l'autenticazione al servizio deve supportare l'attendibilità della catena. Ovvero, deve essere concatenato a un'autorità di certificazione radice attendibile. In caso contrario, il livello HTTP genera un WebException con il messaggio "Il server remoto ha restituito un errore: (403) Accesso negato". WCF espone questa eccezione come .MessageSecurityException

Convalida dei certificati del servizio HTTPS

Quando si usa HTTPS per comunicare tra un client e un servizio, il certificato con cui il server esegue l'autenticazione deve supportare l'attendibilità della catena per impostazione predefinita. Ovvero, deve essere concatenato a un'autorità di certificazione radice attendibile. Non viene eseguito alcun controllo online per verificare se il certificato è stato revocato. È possibile eseguire l'override di questo comportamento registrando un RemoteCertificateValidationCallback callback, come illustrato nel codice seguente.

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

dove la firma per ValidateServerCertificate è la seguente:

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

L'implementazione ValidateServerCertificate può eseguire eventuali controlli che lo sviluppatore dell'applicazione client ritiene necessario per convalidare il certificato del servizio.

Convalida dei certificati client in SSL tramite TCP o Sicurezza SOAP

Quando si utilizza Secure Sockets Layer (SSL) su TCP o sulla sicurezza dei messaggi (SOAP), i certificati client vengono convalidati in base al valore della proprietà della classe CertificateValidationModeX509ClientCertificateAuthentication. La proprietà è impostata su uno dei X509CertificateValidationMode valori. Il controllo delle revoche viene eseguito in base al valore della proprietà della classe RevocationModeX509ClientCertificateAuthentication. La proprietà è impostata su uno dei X509RevocationMode valori.

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

Convalida del certificato di servizio in SSL su TCP e sicurezza SOAP

Quando si usa SSL tramite TCP o sicurezza dei messaggi (SOAP), i certificati del servizio vengono convalidati secondo il valore della proprietà CertificateValidationMode della classe X509ServiceCertificateAuthentication. La proprietà è impostata su uno dei X509CertificateValidationMode valori.

Il controllo delle revoche viene eseguito in base al valore della proprietà della classe RevocationModeX509ServiceCertificateAuthentication. La proprietà è impostata su uno dei X509RevocationMode valori.

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

Vedere anche