SSL证书预取.NET

时间:2010-03-24 17:16:34

标签: c# .net windows ssl ssl-certificate

我正在编写一个实用程序,可以让我监控我们网站的健康状况。这包括一系列可以针对Web应用程序运行的验证任务。其中一项测试是预测特定SSL证书的到期。

我正在寻找一种方法来预先使用.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;
        }
    }

1 个答案:

答案 0 :(得分: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://协议。

e.g。 string contosoExpiry = GetSSLExpiryData(“https://www.contoso.com/”);