簡體   English   中英

“根據驗證程序,遠程證書無效”使用 HttpClient

[英]"The remote certificate is invalid according to the validation procedure" using HttpClient

無法解決證書驗證問題。

有一個 Web API 服務器,它使用 HTTPS 來處理請求。 服務器的證書有這樣的認證路徑:RCA(根)-> ICA(中級)-> Web API 服務器。 RCA、ICA 和 Web API 服務器是同一個 Active Directory 域的成員。

客戶端應用(桌面、電腦加入同域)使用HttpClient與服務器通信,支持兩種場景:

  • 連接到企業網絡;
  • 與公司網絡斷開連接(互聯網訪問)。

這兩種情況都使用基本身份驗證。
RCA 和 ICA 證書分別放置在“受信任的根證書頒發機構”和“中間證書頒發機構”中,用於本地計算機帳戶。 RCA 證書是自簽名的。

現在,當客戶端連接到公司網絡時,證書驗證按預期工作,用戶可以與 Web API“對話”。

當客戶端斷開連接(僅 Internet 連接可用)時,證書驗證失敗並顯示AuthenticationException (“根據驗證程序,遠程證書無效”)。

我不想完全關閉證書驗證,但只需要一種方法來告訴驗證系統,這個特定的證書是有效的。 此外,客戶端應用程序使用 SignalR,它默認使用它自己的傳輸。 因此,不是選項。

為什么將 RCA 和 ICA 證書放置到“受信任...”和“中間...”文件夾沒有幫助?

有什么解決方法嗎?

您遇到的問題是因為證書提供的主題 CN 與 Uri 中的主機名不匹配。

確保綁定到主機公共 IP 地址的證書確實具有與您用來訪問資源的主機名匹配的 CN。

要輕松驗證,請在瀏覽器中打開 Url 並查看證書。 頒發給字段應包含 FQDN 並匹配 Uri 中的主機名部分。 在你的情況下,它沒有。

在過程體上插入這段代碼:

static void Main(string[] args)   
{
     ServicePointManager.ServerCertificateValidationCallback =
                delegate (object sender, X509Certificate certificate, X509Chain 
     chain, SslPolicyErrors sslPolicyErrors)
                {
                    return true;
                };
     ....
}

不幸的是,@Qosai 的答案對我來說還不夠,至少在 SignalR 3.1 客戶端中是這樣,因為 websocket 部分還驗證 SSL 證書。 ClientCertificateOptions需要設置為 Manual。

我發現 SignalR 貢獻者的一篇文章讓我工作:

_connection = new HubConnectionBuilder()
            .WithUrl(new Uri(hub_uri), options => {
                options
                    .Cookies
                    .Add(http_helper.loginCookie);

                var handler = new HttpClientHandler
                {
                    ClientCertificateOptions = ClientCertificateOption.Manual,
                    ServerCertificateCustomValidationCallback = (httpRequestMessage, cert, cetChain, policyErrors) => true
                };
                options.HttpMessageHandlerFactory = _ => handler;
                options.WebSocketConfiguration = sockets =>
                {
                    sockets.RemoteCertificateValidationCallback = (sender, certificate, chain, policyErrors) => true;
                };
            })
            .Build();

PS:如果您仍然有問題,請查看有關如何正確啟用日志記錄的文章 就我而言,這有點棘手,因為 xUnit 不顯示控制台輸出。 因此,我啟用了調試日志記錄到文件(不在代碼段中)

暫無
暫無

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

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