2017-04-04 48 views
0

我使用HttpClient与我的WebAPI服务进行通信。对于SSL认证,我成立了HttpClient的使用WebRequestHandler客户端证书 -WebRequestHandler中的ClientCertificates

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; 
    } 

在服务,我有一个自定义DelegatingHandler使用指纹验证客户端证书 -

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

从HttpRequest的,我只能获得一个客户端证书。

我的问题:为什么WebRequestHandler允许设置一个ClientCertificates集合?它是否将所有客户端证书提供给服务器?如果是,那么我如何获得DelegatingHandler中的客户端证书列表?

回答

0

事实上,在服务器上获得的TLS \ SSL握手过程中,客户端只能向客户端发送一个证书。选择此证书的过程详述如下here


简单的解释是 - 客户会选择从X509CertificateCollection寻找由服务器端和客户端证书颁发者名称提供的证书颁发者的列表之间的匹配最合适的证书。匹配的第一个证书发送到服务器。如果没有证书匹配或证书集合为空,则匿名凭证将发送到服务器。更好地描述TLS \ SSL工作的深层机制here

相关问题