Differenze di convalida del certificato tra HTTPS, SSL su TCP e protezione SOAP

È possibile usare i certificati in Windows Communication Foundation (WCF) con sicurezza a livello di messaggio (SOAP) oltre alla sicurezza a livello di trasporto (TLS) tramite HTTP (HTTPS) o TCP. In questo argomento vengono descritte le differenze nella modalità di convalida dei certificati.

Convalida di certificati di client HTTPS

In caso di utilizzo di HTTPS per la comunicazione tra un client e un servizio, il certificato utilizzato dal client per autenticare il servizio deve supportare la catena di certificati, ovvero deve concatenarsi a un'Autorità di certificazione radice attendibile. In caso contrario, il livello HTTP genera un oggetto con il messaggio "Il server remoto ha restituito un WebException errore: (403) Non consentito". WCF esegue questa eccezione come MessageSecurityException.

Convalida di certificati di servizi HTTPS

In caso di utilizzo di HTTPS per la comunicazione tra un client e un servizio, il certificato autenticato dal server deve supportare la catena di certificati per impostazione predefinita, ovvero deve concatenarsi a un'Autorità di certificazione radice attendibile. Non viene eseguito alcun controllo in linea per appurare se il certificato è stato revocato. È possibile eseguire l'override di questo comportamento registrando un callback RemoteCertificateValidationCallback, come illustrato nel codice seguente.

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

dove la firma per ValidateServerCertificate è come segue:

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 di ValidateServerCertificate può eseguire qualsiasi controllo che lo sviluppatore dell'applicazione client ritenga necessario per convalidare il certificato del servizio.

Convalida di certificati client in SSL su TCP o protezione SOAP

Quando si utilizza SSL (Secure Sockets Layer) su TCP o la protezione dei messaggi (SOAP), i certificati client vengono convalidati secondo il valore della proprietà CertificateValidationMode della classe X509ClientCertificateAuthentication. La proprietà è impostata su uno dei valori X509CertificateValidationMode. La verifica della revoca viene eseguita secondo i valori del valore della proprietà RevocationMode della classe X509ClientCertificateAuthentication. La proprietà è impostata su uno dei valori 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

Convalida di certificati del servizio in SSL su TCP e protezione SOAP

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

La verifica della revoca viene eseguita secondo i valori del valore della proprietà RevocationMode della classe X509ServiceCertificateAuthentication. La proprietà è impostata su uno dei valori 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

Vedi anche