![](/img/trans.png)
[英]the remote certificate is invalid according to the validation procedure using imap
[英]"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.