Упреждающая выборка сертификата SSL.NET

Я пишу утилиту, которая позволила бы мне контролировать здоровье наших веб-сайтов. Это состоит из серии задач проверки, которые я могу выполнить против веб-приложения. Один из тестов должен ожидать истечение конкретного сертификата SSL.

Я ищу способ выбрать с упреждением сертификат SSL, установленный на веб-сайте с помощью.NET или WINAPI так, чтобы я мог проверить дату истечения срока сертификата, связанного с конкретным веб-сайтом.

Одним путем я мог сделать, это должно кэшировать сертификаты, когда они проверены в ServicePointManager. Обработчик ServerCertificateValidationCallback и затем подходит их с настроенными веб-сайтами, но это кажется небольшим hackish. Другой должен был бы настроить приложение с сертификатом для веб-сайта, но я скорее избегу этого, если я могу для уменьшения конфигурации.

Каков был бы самый легкий способ для меня загрузить сертификат SSL, связанный с веб-сайтом с помощью.NET так, чтобы я мог осмотреть информацию, которую сертификат содержит для проверки его?

Править:

Для расширения на ответе ниже нет никакой потребности вручную создать 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;
        }
    }
12
задан Wil P 24 March 2010 в 20:30
поделиться

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 для фактического веб-сайта, который хотите знать. о.

РЕДАКТИРОВАТЬ: убедитесь, что параметр url использует протокол https: //.

например. string contosoExpiry = GetSSLExpiryData (" https://www.contoso.com/ ");

17
ответ дан 2 December 2019 в 19:53
поделиться