Предварительный сертификат SSL-сертификата .NET.
Я пишу утилиту, которая позволит мне следить за состоянием наших сайтов. Это состоит из ряда задач проверки, которые я могу выполнить против веб-приложения. Один из тестов - предвидеть истечение срока действия конкретного сертификата SSL.
Я ищу способ предварительно получить сертификат SSL, установленный на веб-сайте, с помощью .NET или WINAPI, чтобы я мог проверить дату истечения срока действия сертификата, связанного с конкретным веб-сайтом.
Один из способов сделать это - кешировать сертификаты, когда они проверяются в обработчике ServicePointManager.ServerCertificateValidationCallback, а затем сопоставлять их с настроенными веб-сайтами, но это кажется немного хакерским. Другим было бы настроить приложение с сертификатом для веб-сайта, но я бы предпочел избежать этого, если смогу, чтобы свести к минимуму конфигурацию.
Что было бы самым простым способом загрузить сертификат SSL, связанный с веб-сайтом с помощью .NET, чтобы я мог проверить информацию, содержащуюся в сертификате, для ее проверки?
EDIT:
Чтобы расширить ответ ниже, нет необходимости вручную создавать 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
Я только что попробовал это, что "работает на моей машине (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 для фактического веб-сайта, который вы хотите знать о.
EDIT:
убедитесь, что параметр "url" использует протокол https://.
например. string contosoExpiry = GetSSLExpiryData ( " https://www.contoso.com/" );