【问题标题】:Using custom root CA with HttpClient将自定义根 CA 与 HttpClient 一起使用
【发布时间】:2022-04-08 04:52:43
【问题描述】:

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

据我所知,在其他语言中有很简单的方法:

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

  2. 在 Node.js 中,使用 NODE_EXTRA_CA_CERT 环境变量。

但到目前为止,我在 .Net 上找不到类似的东西。有没有像上面这样简单的方法?

【问题讨论】:

  • 有一个回调来验证服务器证书:docs.microsoft.com/en-us/dotnet/api/…
  • 哦,我明白了,谢谢。但我仍然想知道是否有像上面这样的简单方法(例如通过 env 变量)来避免重写证书验证的整个逻辑。基本上使用内置验证,但考虑我为该过程提供的证书是根证书之一。
  • 我不知道任何

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


【解决方案1】:

我为此奋斗了一段时间,除了上面 cmets 中指向 https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclienthandler.servercertificatecustomvalidationcallback?view=net-5.0 的链接中提到的用户 evk 提到的“编写你自己的回调处理程序”之外,似乎没有好的答案,但这并没有'''并没有真正解释该回调中应该包含什么。然后我偶然发现了这条评论https://github.com/dotnet/runtime/issues/39835#issuecomment-663020581

事实证明,使用自定义根证书非常简单。基本上,更改链策略以使用自定义根,添加您的自定义根,然后在链上调用 build。

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);
}

请注意,您可能仍需要检查其他一些事项,例如是否存在其他政策错误。此答案仅涵盖使用自定义受信任的根。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2017-09-30
    • 2017-07-04
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多