WebRequestHandler中的ClientCertificates

时间:2017-04-04 00:27:43

标签: asp.net-web-api httpclient

我使用HttpClient与我的WebAPI服务进行通信。对于SSL身份验证,我使用WebRequestHandler -

在HttpClient上设置客户端证书
    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中获取客户端证书列表?

1 个答案:

答案 0 :(得分:1)

实际上,在服务器上获取的TLS \ SSL握手期间,客户端只会向服务器发送一个证书。选择此证书的过程已得到充分描述here

简要说明 - 客户端将从X509CertificateCollection中选择最合适的证书,以查找服务器提供的证书颁发者列表与客户端证书颁发者名称之间的匹配。匹配的第一个证书将发送到服务器。如果没有证书匹配或证书集合为空,则会向服务器发送匿名凭据。 TLS \ SSL工作的深层机制以良好的方式描述here