2017-04-04 1 views
0

J'utilise HttpClient pour parler à mon service WebAPI. Pour l'authentification SSL, configurer les certificats client sur le HttpClient en utilisant WebRequestHandler -ClientCertificates dans WebRequestHandler

private static WebRequestHandler CreateWebRequestHandler(List<X509Certificate2> clientCertificates) 
    { 
     WebRequestHandler handler = new WebRequestHandler(); 

     if (clientCertificates != null && clientCertificates.Any()) 
     { 
      handler.ClientCertificateOptions = ClientCertificateOption.Manual; 
      clientCertificates.ForEach(cert => handler.ClientCertificates.Add(cert)); 
     } 

     return handler; 
    } 

Sur le service, j'ai un DelegatingHandler personnalisé pour valider les certificats clients en utilisant thumbprint -

protected override async Task<HttpResponseMessage> SendAsync(
     HttpRequestMessage request, 
     CancellationToken cancellationToken) 
    {   
     X509Certificate2 certificate = request.GetClientCertificate(); 
     // Code to validate certificate's Thumbprint with white listed thumbprints      
    } 

De l'HttpRequest , Je ne peux obtenir qu'un seul certificat client.

Ma question: Pourquoi WebRequestHandler permet-il de définir une collection de ClientCertificates? Présente-t-il tous les certificats clients au serveur? Si oui, comment puis-je obtenir la liste des certificats clients dans DelegatingHandler?

Répondre

0

En réalité, un seul certificat est envoyé au serveur par un client lors de l'établissement de liaison TLS \ SSL que vous obtenez sur le serveur. Le processus de choix de ce certificat est bien décrit here.


explication est brièvement - le client choisira le meilleur certificat approprié de X509CertificateCollection la recherche d'un match entre la liste des émetteurs de certificats fournis par le serveur et le certificat client nom de l'émetteur. Le premier certificat correspondant est envoyé au serveur. Si aucun certificat ne correspond ou si la collection de certificats est vide, un identifiant anonyme est envoyé au serveur. Le mécanisme plus profond du travail TLS \ SSL décrit dans une bonne manière here