即使没有CA匹配,也强制ASP.NET WebAPI客户端发送客户端证书

Dav*_*ner 10 client-certificates .net-4.5 asp.net-web-api

我有一个特定的应用程序,需要使用客户端证书进行HTTPS请求的相互身份验证.服务器具有灵活的证书验证策略,允许它接受服务器证书存储中不存在的自签名客户端证书.众所周知,使用curl作为客户端可以正常工作.

我通过测试和数据包嗅探确定的是,微软的ASP.NET HttpClient试图在SSL握手过程中过于聪明.如果该客户端证书WebRequestHandler.ClientCertificates与服务器的可信根之一具有信任链,则该特定客户端将仅使用客户端证书(来自集合).我观察到的是,如果没有带有信任链的证书,那么客户端在握手期间根本不会发送证书.

这是可以理解的默认行为,但是过于严格,似乎没有办法将其关闭.我已经尝试了其他各种WebRequestHandler属性,包括AuthenticationLevelClientCertificateOptions,但无济于事.

有没有办法强制HttpClientClientCertificates集合中可用时发送客户端证书,即使它看起来不会在服务器端验证?我对那些直截了当和肮脏(反射黑客)解决方案持开放态度,因为我真的需要这个客户端才能工作.

kom*_*sky -1

我有同样的问题,同样不走运。还观察到一个奇怪的行为,当 WebRequesthandler 有时确实发送证书时,具体取决于线程/AppPool 凭据。

我已经通过用 RestClient 替换 HttpClient 来解决这个问题。RestClient 是开源的,可通过 nuget 获取。

RestSharp页面

API 非常相似,并且可以实现所需的魔力,而无需抱怨证书:

        var restClient = new RestClient($"{serviceBaseUrl}{requestUrl}");
        X509Certificate certificate = GetCertificateFromSomewhere();
        restClient.ClientCertificates = new X509CertificateCollection { certificate };
        var request = new RestRequest(Method.POST);
        request.RequestFormat = DataFormat.Json;
        request.AddParameter(new Parameter()
        {
            Type = ParameterType.RequestBody,
            Name = "Body",
            ContentType = "application/json",
            Value = "{your_json_body}"
        });

        IRestResponse<T> response = client.Execute<T>(request);
        if (response.ErrorException != null)
        {
            throw new Exception(response.Content, response.ErrorException);
        }
        return response.Data;
Run Code Online (Sandbox Code Playgroud)