我正在编写一个实用程序,可以让我监视我们网站的健康状况。 这包含一系列可以针对Web应用程序运行的validation任务。 其中一项testing是预测特定SSL证书的到期date。
我正在寻找一种方法来预先获取安装在网站上的使用.NET或WINAPI的SSL证书,以便我可以validation与特定网站相关联的证书的到期date。
我可以做到这一点的一个方法是caching证书,当它们在ServicePointManager.ServerCertificateValidationCallback处理程序中进行validation,然后将它们与configuration的网站进行匹配,但是这似乎有点冒失鬼。 另一种方法是使用网站的证书configuration应用程序,但是如果可以的话,我宁愿避免这种情况,以尽量减lessconfiguration。
使用.NET下载与网站相关的SSL证书最简单的方法是什么,这样我可以检查证书包含的信息来validation它?
编辑:
为了扩展下面的答案,在创build请求之前不需要手动创buildServicePoint。 它是在请求对象上生成的,作为执行请求的一部分。
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; } }
我刚刚尝试过这个“在我的机器上运行”(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的所有权利和错误,以及任何其他可能需要跳过的箍筋,但是您确实需要了解您希望了解的实际Web站点的SSL终止日期。
编辑:确保“url”参数使用https://协议。
例如字符串contosoExpiry = GetSSLExpiryData(“ https://www.contoso.com/ ”);