c# - 将自定义根 CA 与 HttpClient 结合使用

标签 c# ssl .net-core dotnet-httpclient ca

在 C# 中,当使用 HttpClient 时,如何连接到使用自签名证书(用于测试)或不属于机器信任库的自定义 CA 的 https 服务器?请注意,我不需要客户端证书,只需要 HttpClient 来验证未由机器上受信任的根 CA 之一签名的服务器证书。我知道我可以将自签名证书或 CA 添加到机器上的本地信任库,但假设我想避免这样做。我需要的基本上是为正在运行的应用程序提供额外的根 CA。

据我所知,在其他语言中有很简单的方法可以做到这一点:

  1. 在 java 中,使用“javax.net.ssl.trustStore”系统属性。

  2. 在 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/

相关文章:

apache - 使用 VirtualDocumentRoot 在 SSL 中进行虚拟托管

java - Apache Commons Http 客户端 - 注册客户端特定协议(protocol)

c# - 将加载配置添加到asp.net core中的注入(inject)依赖项

c# - Identity Server 4 - 空闲时注销用户

azure - 如何报告 Windows Server 服务总线中的错误?

c# - 扩展方法如何工作

c# - .NET MVC 文件上传 - 重叠 I/O 操作正在进行中

c# - 无法设置 AuthenticationHeaderValue

c# - Application.Run 抛出 ArgumentException 未处理

php - 使用 SSL 验证 LDAP/Active Directory 登录