我应该如何使用 HttpClient 的证书?

How should I use a certificate with HttpClient?

我需要使用我们合作伙伴之一的网站 API。他们 API 要求我使用证书进行连接。

我不想在我们的服务器 (VM) 上安装证书。这对我们的凤凰服务器策略适得其反。

我尝试以编程方式使用证书。问题是我得到一个错误:

AuthenticationException: The remote certificate is invalid according to the validation procedure.

我使用以下代码创建我的 HttpClient

_certificate = new X509Certificate2(_certificateFile);
var handler = new WebRequestHandler();
handler.ClientCertificates.Add(_certificate);
var client = new HttpClient(handler) { BaseAddress = new Uri(_url) };

我可以通过覆盖证书验证使其工作:

ServicePointManager.ServerCertificateValidationCallback += delegate { return true; };

但这看起来风格很差。

我已验证我的端点与证书中的 CN 匹配

是否AuthenticationException仅仅是因为证书库中没有安装证书?

如果是,我可以暂时用代码安装证书,然后删除它吗?

"The remote certificate is invalid" 表示 .NET Framework 认为您合作伙伴的 Web 服务的服务器端证书无效(如果您没有安装必要的 root/intermediate 证书,则很正常)。

您可以通过更改 ServerCertificateValidationCallback 来取消默认检查,但您应该实施自己的检查以确保以合理的方式验证他们的证书以避免攻击。

你还应该使用HttpClientHandler.ServerCertificateValidationCallback,这样你的自定义验证器只在这个特定的HttpClient实例的范围内生效,而不会影响你应用程序的其他地方,

https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclienthandler.servercertificatecustomvalidationcallback?view=netframework-4.8

但是,他们给你的证书(通常是客户端证书)是由他们的网络服务验证的,而不是在你的机器上本地验证的。