2008-04-09

HttpWebRequest 與 https

HttpWebRequest 透過 SSL 取得網頁資訊時, 如果對方網站的憑證不被自己的電腦所信任的話, 就會出現 "基礎連接已關閉: 無法為 SSL/TLS 安全通道建立信任關係。" 的錯誤, 英文版的錯誤訊息是 "The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.", 在 .NET 1.1 時代曾經用 ServicePointManager.CertificatePolicy 解決過這個問題, 但到了 .NET 2.0 之後, 該方法被列為 obsolete 了, 所以就研究了一下新的方法, 順便做個記錄

// .NET 1.1
ServicePointManager.CertificatePolicy = new AcceptAllCertificatePolicy();

如果是 .NET 1.1, 我們必須自行建立一個像上面範例碼的 AcceptAllCertificatePolicy 類別, 並讓該類實作 ICertificatePolicy 介面, 該介面只有一個方法叫 CheckValidationResult, 回傳 bool 來決定是否接受對方的憑證, 直接 return true 就行了.

public class AcceptAllCertificatePolicy : ICertificatePolicy
{
    public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem)
    {
        return true;
    }
}
.NET 2.0 簡單多了, 只要一行, 透過匿名函式就行了!
// .NET 2.0
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

沒有留言: