使用 HttpWebRequest 呼叫 HTTPS 服務時,拋出例外:
「基礎連接已經關閉: 無法與遠程服務器建立信任關系。」
The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.
// 必須在第一個 HttpWebRequest 建立前調用 (如 Application_Start、Main、靜態建構子)
System.Net.ServicePointManager.ServerCertificateValidationCallback
= (sender, certificate, chain, sslPolicyErrors) => true;
優點:一行解決、無需修改業務代碼。
缺點:極度不安全,中間人攻擊零防禦,**嚴禁生產環境使用**。
public class TrustAllCertificatePolicy : System.Net.ICertificatePolicy
{
public bool CheckValidationResult(
ServicePoint sp,
System.Security.Cryptography.X509Certificates.X509Certificate cert,
WebRequest req,
int problem)
{
// problem 代碼對照:
// 0x800B010F (CN不匹配) | 0x800B0101 (過期) | 0x800B0109 (根不受信) 等
return true; // 無條件信任
}
}
// 註冊 (同樣需在首次請求前)
ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy();
ServicePointManager.ServerCertificateValidationCallback = (sender, cert, chain, errors) =>
{
// 僅忽略「名稱不匹配」與「過期」,保留其他驗證 (如吊銷、用途)
if (errors == SslPolicyErrors.RemoteCertificateNameMismatch
|| errors == SslPolicyErrors.RemoteCertificateChainErrors) // 包含過期、根不信等
{
// 可加入額外邏輯:檢查憑證指紋、發行者、有效期範圍等
return true;
}
return errors == SslPolicyErrors.None;
};
mmc.exe → 檔案 → 新增/移除嵌入式管理單元 → 憑證 → 電腦帳戶 → 本機電腦。using System.Security.Cryptography.X509Certificates;
var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);
store.Add(new X509Certificate2(@"C:\certs\my-ca.cer"));
store.Close();
// 註冊自訂驗證 (僅開發環境)
var handler = new HttpClientHandler
{
ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
};
var client = new HttpClient(handler);
// 或針對性驗證
var handler = new HttpClientHandler();
handler.ServerCertificateCustomValidationCallback = (msg, cert, chain, errors) =>
{
// 自訂邏輯
return errors == SslPolicyErrors.None || errors == SslPolicyErrors.RemoteCertificateNameMismatch;
};
var client = new HttpClient(handler);
| 代碼 (Hex) | 常數名稱 | 含義 |
|---|---|---|
| 0x800B0101 | CERT_E_EXPIRED | 憑證過期 |
| 0x800B0109 | CERT_E_UNTRUSTEDROOT | 根憑證不受信任 |
| 0x800B010F | CERT_E_CN_NO_MATCH | 主體名稱 (CN) 與主機名不符 |
| 0x800B010C | CERT_E_REVOKED | 憑證已吊銷 |
| 0x800B010E | CERT_E_REVOCATION_FAILURE | 吊銷檢查失敗 (離線/無法連線 CRL/OCSP) |
openssl s_client -connect host:port -showcerts 抓取憑證鏈分析。HttpWebRequest.ClientCertificates 已正確加載含私鑰的 .pfx。ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;。SSL/TLS 信任失敗本質是憑證鏈驗證不通過。根治之道是修正憑證部署;臨時繞過需權衡風險,優先使用 ServerCertificateValidationCallback 針對性放行,並嚴格限制範圍。現代專案請遷移至 HttpClient,享受更優雅的 API 與跨平台一致性。