【问题标题】:ClientCertificates in WebRequestHandlerWebRequestHandler 中的 ClientCertificates
【发布时间】:2017-08-29 00:21:34
【问题描述】:

我使用 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 中获取客户端证书列表?

【问题讨论】:

    标签: asp.net-web-api httpclient


    【解决方案1】:

    实际上,在您在服务器上获得的 TLS\SSL 握手期间,客户端仅向服务器发送一个证书。选择此证书的过程在here 中有很好的描述。


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

    【讨论】:

      猜你喜欢
      • 2020-10-16
      • 1970-01-01
      • 2019-06-11
      • 1970-01-01
      • 1970-01-01
      • 2014-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多