我正在编写一个实用程序,可以让我监控我们网站的健康状况。这包括一系列可以针对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;
}
}
答案 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/”);