SSL证书预取.NET

Wil*_*l P 12 .net c# 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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

Nei*_*oss 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;
}
Run Code Online (Sandbox Code Playgroud)

我担心我不知道使用ServicePoint的所有权利和错误,以及您可能需要跳过的任何其他箍,但您确实获得了想要了解的实际网站的SSL到期日期.

编辑:确保"url"参数使用https://协议.

例如string contosoExpiry = GetSSLExpiryData(" https://www.contoso.com/ ");