Предварительная загрузка сертификата SSL .NET - PullRequest
12 голосов
/ 24 марта 2010

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

17 голосов
/ 24 марта 2010

Я только что попробовал это, которое "работает на моей машине (тм)".

Возвращает текстовую строку, представляющую дату истечения срока действия сертификата сервера, и требует, чтобы фактическое попадание было сделано на веб-сайте.

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: //.

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

...