Dav*_*ner 10 client-certificates .net-4.5 asp.net-web-api
我有一个特定的应用程序,需要使用客户端证书进行HTTPS请求的相互身份验证.服务器具有灵活的证书验证策略,允许它接受服务器证书存储中不存在的自签名客户端证书.众所周知,使用curl作为客户端可以正常工作.
我通过测试和数据包嗅探确定的是,微软的ASP.NET HttpClient试图在SSL握手过程中过于聪明.如果该客户端证书WebRequestHandler.ClientCertificates与服务器的可信根之一具有信任链,则该特定客户端将仅使用客户端证书(来自集合).我观察到的是,如果没有带有信任链的证书,那么客户端在握手期间根本不会发送证书.
这是可以理解的默认行为,但是过于严格,似乎没有办法将其关闭.我已经尝试了其他各种WebRequestHandler属性,包括AuthenticationLevel和ClientCertificateOptions,但无济于事.
有没有办法强制HttpClient在ClientCertificates集合中可用时发送客户端证书,即使它看起来不会在服务器端验证?我对那些直截了当和肮脏(反射黑客)解决方案持开放态度,因为我真的需要这个客户端才能工作.
kom*_*sky -1
我有同样的问题,同样不走运。还观察到一个奇怪的行为,当 WebRequesthandler 有时确实发送证书时,具体取决于线程/AppPool 凭据。
我已经通过用 RestClient 替换 HttpClient 来解决这个问题。RestClient 是开源的,可通过 nuget 获取。
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)
| 归档时间: |
|
| 查看次数: |
1675 次 |
| 最近记录: |