2010-03-24 77 views
12

我在寫一個實用程序,它可以讓我監視我們網站的健康狀況。這包含一系列可以針對Web應用程序運行的驗證任務。其中一項測試是預測特定SSL證書的到期日期。SSL證書預取.NET

我正在尋找一種方法來預先獲取安裝在使用.NET或WINAPI的網站上的SSL證書,以便我可以驗證與特定網站關聯的證書的過期日期。

我可以做到這一點的一種方式是緩存證書,當它們在ServicePointManager.ServerCertificateValidationCallback處理程序中進行驗證,然後將它們與配置的網站進行匹配時,但這看起來有點冒失。另一種方法是使用網站證書配置應用程序,但如果可以的話,我寧願避免這種情況,以最大限度地減少配置。

什麼是最簡單的方式來下載與使用.NET的網站相關的SSL證書,以便我可以檢查證書包含的信息以驗證它?

編輯:

要在答案下面延伸沒有必要手動創建之前創建請求的的ServicePoint。它是在請求對象上生成的,作爲執行請求的一部分。

private static string GetSSLExpiration(string url) 
    { 
     HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; 
     using (WebResponse response = request.GetResponse()) { } 
     if (request.ServicePoint.Certificate != null) 
     { 
      return request.ServicePoint.Certificate.GetExpirationDateString(); 
     } 
     else 
     { 
      return string.Empty; 
     } 
    } 
+4

真棒問題:) – 2012-02-28 05:09:01

回答

17

我剛剛試過這個,它「適用於我的機器(tm)」。

它返回表示服務器證書到期日期的文本字符串,並要求在網站上進行實際打擊。

private string GetSSLExpiryDate(string url) 
{ 
    Uri u = new Uri(url); 
    ServicePoint sp = ServicePointManager.FindServicePoint(u); 

    string groupName = Guid.NewGuid().ToString(); 
    HttpWebRequest req = HttpWebRequest.Create(u) as HttpWebRequest; 
    req.ConnectionGroupName = groupName; 

    using (WebResponse resp = req.GetResponse()) 
    { 
     // Ignore response, and close the response. 
    } 
    sp.CloseConnectionGroup(groupName); 

    // Implement favourite null check pattern here on sp.Certificate 
    string expiryDate = sp.Certificate.GetExpirationDateString(); 

    return expiryDate; 
} 

我怕我不知道所有的權利和使用的ServicePoint的過錯,那你可能需要通過跳躍其他任何籃球,但你得到的實際網站的SSL到期日你想知道。

編輯: 確保「url」參數使用https://協議。

例如字符串contosoExpiry = GetSSLExpiryData(「https://www.contoso.com/」);

+0

好男人 - 作品完美。謝謝!!! – 2010-03-24 18:14:32

+0

當我遇到異常時,我使用它來編寫證書詳細信息。很棒。 – GregB 2011-04-13 18:54:48

+0

當我讀到這個時,我的主要問題是'這個ServicePoint的事情是什麼?'它似乎是連接到特定站點http或https的「連接助手」對象,並共享重複連接到該站點所需的信息,例如,在這種情況下,證書。便利。 – 2012-02-28 05:13:26