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

Oltre alla protezione a livello di trasporto (TLS) su HTTP (HTTPS) o TCP, in Windows Communication Foundation (WCF) è possibile utilizzare certificati con la protezione a livello dei messaggi (SOAP). 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'eccezione WebException con il messaggio "Errore del server remoto: (403) non consentito". In WCF questa eccezione viene gestita come un oggetto 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