使用自定义根证书颁发机构与HttpClient

5
在使用C#的HttpClient时,如何连接到使用自签名证书(用于测试)或不在机器信任存储中的自定义CA的https服务器?注意,我不需要客户端证书,只需要HttpClient验证由机器上未受信任根CA之一签署的服务器证书。我知道可以将自签名证书或CA添加到计算机上的本地信任库中,但假设我想避免这样做。我需要的基本上是向正在运行的应用程序提供额外的根CA。
我知道其他语言中有相当简单的方法: 1. 在Java中,使用"javax.net.ssl.trustStore"系统属性。 2. 在Node.js中,使用NODE_EXTRA_CA_CERT环境变量。
但是,到目前为止,我还没有找到类似于上述内容的.Net简单方式。是否有像上面那样简单的方式?

有一个回调函数用于验证服务器证书:https://learn.microsoft.com/zh-cn/dotnet/api/system.net.http.httpclienthandler.servercertificatecustomvalidationcallback?view=net-5.0 - Evk
哦,我明白了,谢谢。但我仍然想知道是否有一种简单的方法(例如通过环境变量)来避免重写整个证书验证逻辑。基本上使用内置验证,但将我提供的证书视为根证书之一。 - Yevgeniy P
我不知道任何的。 - Evk
1个回答

1

我曾经为此苦苦挣扎,似乎没有好的答案,除了像用户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

事实证明,使用自定义根证书非常简单。基本上,修改链策略以使用自定义根,添加您的自定义根,并在链上调用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);
}

请记住,您可能仍然希望检查其他事项,例如是否存在其他策略错误。此答案仅涵盖使用自定义受信任根的情况。


有没有替代dotnet 3.1的选择? - Parzival

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接