我已获得用于验证某个服务器的 pfx 和 pem 客户端证书,任务是使用这些证书中的任何一个发送 POST 请求。需要使用这些证书进行调用的应用程序是.net core webapi。在进行调用之前,我尝试了多种方法在 http 客户端中添加此客户端证书,但每次我都会收到 401 Unauthorized。我也尝试过 RestSharp,但没有成功。但有趣的是,这可以与 Postman 无缝配合。有人可以帮忙吗?下面是我当前根据 Microsoft 文档使用的命名 HttpClient 注册和请求代码。
启动时:
var clientCertificate = new X509Certificate2(@"C:\Dir\Client.pfx", "Password");
builder.Services.AddHttpClient("namedClient", c =>
{
}).ConfigurePrimaryHttpMessageHandler(() =>
{
var handler = new HttpClientHandler();
handler.ClientCertificates.Add(clientCertificate);
handler.SslProtocols = SslProtocols.Tls12;
handler.AllowAutoRedirect = true;
handler.PreAuthenticate = true;
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
return handler;
});
builder.Services.AddControllers();
...
业务逻辑:
var client = _httpClientFactory.CreateClient("namedClient");
var request = new HttpRequestMessage()
{
RequestUri = new Uri("https://www.test.com/resource1"),
Method = HttpMethod.Post,
};
request.Headers.Host = "www.test.com";
var response = client.SendAsync(request).GetAwaiter().GetResult();
我们遇到了同样的问题,即。 Postman 或 Python 脚本可以使用客户端证书调用远程 API,而不会出现问题,而我们的 C# 程序则不能。
最终有帮助的是:我们将 .pfx 导入到“中级证书颁发机构”存储中(在将调用 c# 程序的用户下)。之后c#程序也可以正常工作了。
我也遇到过同样的问题。通过curl和postman调用可以工作,但在代码中不起作用。
尝试打开
HttpClientHandler
SocketsHttpHandler
:
var handler = new SocketsHttpHandler();
handler.SslOptions = new SslClientAuthenticationOptions
{
ClientCertificates = new X509CertificateCollection { clientCertificate }
};
尽管
HttpClientHandler
是基于 SocketsHttpHandler
的。 |链接这里