遠端證書被使用者驗證為無效
在 azure 虛擬機中,我有一個 Web 應用程序和一個子 Web 應用程序,其中 FormsAuthentication 和 HTTPS 配置了有效證書。身份驗證在主應用程序和子應用程序之間使用相同的機器密鑰共享。兩個應用程序都需要 SSL
使用公共網址從外面一切都可以。
我需要將一些請求從主應用程序發送到具有公共名稱的子應用程序以進行配置(子應用程序可以安裝在另一台伺服器上)。這些請求使用特定帳戶進行辨識。
這是我將請求從主應用程序發送到子應用程序的程式碼,this.WebApiUrl 是公共 url:
// If we are not authenticated if(!isAuthenticated) { // Check user and login if(!User.Check(this.WebApiLogin, this.WebApiPassword)) throw new Exception("Unauthorized user"); isAuthenticated = true; } // Convert HttpCookie to Cookies var cookies = FormsAuthentication.GetAuthCookie(this.WebApiLogin, false).ToCookies(); // Create request with the authentication cookie Uri baseAddress = new Uri(this.WebApiUrl); CookieContainer cookieContainer = new CookieContainer(); foreach(var cookie in cookies) { if(String.IsNullOrEmpty(cookie.Domain)) cookie.Domain = baseAddress.Host; if(baseAddress.Scheme == "https") cookie.HttpOnly = false; cookieContainer.Add(cookie); } // send request using(HttpClientHandler handler = new HttpClientHandler() { CookieContainer = cookieContainer }) { using(HttpClient client = new HttpClient(handler)) { client.BaseAddress = baseAddress; client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); return client.GetStringAsync(requestUri).Result; } }沒有ssl一切都好。當我啟動 ssl 時,主應用程序和子域應用程序之間的請求失敗
底層連接已關閉:無法為 SSL/TLS 安全通道建立信任關係。
這是來自 System.Net 和 System.Net 套接字的系統日誌。
System.Net 資訊:0:
$$ 10788 $$SecureChannel#92992 - 遠端證書被使用者驗證為無效。 System.Net.Sockets 詳細:0:
$$ 10788 $$套接字#29502801::Dispose() System.Net 錯誤:0:
$$ 10788 $$HttpWebRequest#61435094 中的異常:: - 底層連接已關閉:無法為 SSL/TLS 安全通道建立信任關係.. System.Net 詳細:0:
$$ 10788 $$HttpWebRequest#61435094::EndGetResponse() System.Net 錯誤:0:
$$ 10788 $$HttpWebRequest#61435094::EndGetResponse 中的異常 - 底層連接已關閉:無法為 SSL/TLS 安全通道建立信任關係。
奇怪的是日誌沒有說明為什麼證書被使用者驗證為無效。儘管此證書對外部請求有效。
**重要提示:**我不想要 ServicePointManager.ServerCertificateValidationCallback 的解決方案,因為它在生產環境中
謝謝你的幫助
您是否在程式碼中提供了
ServerCertificateValidationCallback其他任何地方?我們在實現的回調中存在邏輯缺陷,即使用自簽名證書將指定域列入白名單。即,回調始終在執行——即使對於有效證書也是如此——但僅應用白名單邏輯。因為合法證書不在此列表中,所以回調指示失敗。
這是通過根據
error變數提前返回來解決的:
if (error == SslPolicyErrors.None) return true;