2010-03-24 65 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