簡體   English   中英

將自定義根 CA 與 HttpClient 結合使用

[英]Using custom root CA with HttpClient

在 C# 中,當使用 HttpClient 時,如何連接到使用自簽名證書(用於測試)或不屬於機器信任庫的自定義 CA 的 https 服務器? 請注意,我不需要客戶端證書,只需要 HttpClient 來驗證未由機器上受信任的根 CA 之一簽名的服務器證書。 我知道我可以將自簽名證書或 CA 添加到機器上的本地信任庫,但假設我想避免這樣做。 我需要的基本上是為正在運行的應用程序提供額外的根 CA。

據我所知,用其他語言有很簡單的方法可以做到這一點:

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

  2. 在 Node.js 中,使用 NODE_EXTRA_CA_CERT 環境變量。

但到目前為止,我找不到類似這樣的東西。 有沒有像上面這樣的簡單方法?

我為此苦苦掙扎了一段時間,除了用戶 evk 在https://learn.microsoft.com/en-us/的鏈接中提到的“編寫你自己的回調處理程序”之外,似乎沒有什么好的答案do.net/api/system.net.http.httpclienthandler.servercertificatecustomvalidationcallback?view.net-5.0在上面的評論中,但這並不能真正解釋回調中應該包含什么。 然后我偶然發現了這條評論https://github.com/do.net/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);
}

請記住,您可能仍想檢查其他一些事項,例如是否存在其他政策錯誤。 此答案僅涵蓋使用自定義受信任的根。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM