在 C# 中,当使用 HttpClient 时,如何连接到使用自签名证书(用于测试)或不属于机器信任库的自定义 CA 的 https 服务器?请注意,我不需要客户端证书,只需要 HttpClient 来验证未由机器上受信任的根 CA 之一签名的服务器证书。我知道我可以将自签名证书或 CA 添加到机器上的本地信任库,但假设我想避免这样做。我需要的基本上是为正在运行的应用程序提供额外的根 CA。
据我所知,在其他语言中有很简单的方法可以做到这一点:
在 java 中,使用“javax.net.ssl.trustStore”系统属性。
在 Node.js 中,使用 NODE_EXTRA_CA_CERT 环境变量。
但到目前为止,我还没有为 .Net 找到类似的东西。有没有像上面这样简单的方法?
最佳答案
我为此纠结了一段时间,除了用户 evk 在 https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpclienthandler.servercertificatecustomvalidationcallback?view=net-5.0 的链接中提到的“编写您自己的回调处理程序”之外似乎没有好的答案。在上面的评论中,但这并不能真正解释回调中应该包含什么。然后我偶然发现了这条评论https://github.com/dotnet/runtime/issues/39835#issuecomment-663020581
事实证明,使用自定义根证书非常简单。基本上,更改链策略以使用自定义根,添加自定义根,然后在链上调用构建。
private static bool ServerCertificateCustomValidation(
HttpRequestMessage requestMessage,
X509Certificate2? certificate,
X509Chain? chain,
SslPolicyErrors sslErrors)
{
if (certificate == null) return false;
if (chain == null) return false;
chain.ChainPolicy.TrustMode = X509ChainTrustMode.CustomRootTrust;
chain.ChainPolicy.CustomTrustStore.Add(GetTrustedRootCert());
return chain.Build(certificate);
}
请记住,您可能仍想检查一些其他事项,例如是否存在其他政策错误。此答案仅涵盖使用自定义可信根。
关于c# - 将自定义根 CA 与 HttpClient 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64905704/