Определить срок действия сертификата SSL IIS - PullRequest
7 голосов
/ 05 мая 2009

Мне нужно определить дату истечения срока действия сертификатов SSL на моих ящиках IIS программно. В идеале я хотел бы сделать это в C #, но если VB-скрипт является единственным приемлемым способом.

Среда => IIS версии 6 и 7, .NET 2.0, Windows 2003 и 2008

Спасибо

Ответы [ 4 ]

10 голосов
/ 19 октября 2010

Мне не знаком способ выполнения этой проверки с VBS и / или WMI, поскольку это, возможно, целое безопасности, поскольку оно потенциально может раскрыть закрытый ключ. Однако есть способ использовать обычное HTTPS-соединение для получения общедоступной информации о сертификате. Если вы подключаетесь к любому безопасному веб-сайту с помощью IE, вы можете перейти в меню «Файл», просмотреть свойства и нажать кнопку «Сертификаты». Это показывает общедоступный диалог информации о сертификате для сайта. Вы можете получить эту информацию программно, используя C #.

По сути, вам нужно открыть TCP-соединение с сервером через порт 443 и затем получить данные SSL. В этом потоке данных находится публичная информация о сертификате, и вы можете проверить его и извлечь из него всю необходимую информацию, включая дату истечения срока действия. Вот пример кода:

static void Main(string[] args) {
    foreach (string servername in args) {
        Console.WriteLine("\n\nFetching SSL cert for {0}\n", servername);
        TcpClient client = new TcpClient(servername, 443);
        SslStream sslStream = new SslStream(client.GetStream(), false, callback, null);

        try {
            sslStream.AuthenticateAsClient(servername);
        } catch (AuthenticationException ex) {
            Console.WriteLine("Exception: {0}", ex.Message);
            if (ex.InnerException != null) {
                Console.WriteLine("Inner exception: {0}", ex.InnerException.Message);
            }
            Console.WriteLine("Authentication failed - closing the connection.");
        }

        client.Close();
    }
}

И код для обратного вызова, который обрабатывает информацию сертификата:

static RemoteCertificateValidationCallback callback = delegate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors sslError) {
    X509Certificate2 x509 = new X509Certificate2(cert);

    // Print to console information contained in the certificate.
    Console.WriteLine("Subject: {0}", x509.Subject);
    Console.WriteLine("Issuer: {0}", x509.Issuer);
    Console.WriteLine("Version: {0}", x509.Version);
    Console.WriteLine("Valid Date: {0}", x509.NotBefore);
    Console.WriteLine("Expiry Date: {0}", x509.NotAfter);
    Console.WriteLine("Thumbprint: {0}", x509.Thumbprint);
    Console.WriteLine("Serial Number: {0}", x509.SerialNumber);
    Console.WriteLine("Friendly Name: {0}", x509.PublicKey.Oid.FriendlyName);
    Console.WriteLine("Public Key Format: {0}", x509.PublicKey.EncodedKeyValue.Format(true));
    Console.WriteLine("Raw Data Length: {0}", x509.RawData.Length);

    if (sslError != SslPolicyErrors.None) {
        Console.WriteLine("Certificate error: " + sslError);
    }

    return false;
};

И круто то, что этот подход технически должен работать с любым веб-сервером ... Я тестировал только на IIS 6 и 7.

5 голосов
/ 18 декабря 2015

Упрощение решения Йонасом Гораускасом:

public class SslCertificateExpirationChecker
{
    public DateTime GetCertificateExpirationDate(string host, int port)
    {
        TcpClient client = new TcpClient(host, port);

        X509Certificate2 x509 = null;
        SslStream sslStream = new SslStream(client.GetStream(), false, 
            delegate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors sslError)
            {
                x509 = new X509Certificate2(cert);
                return true;
            });
        sslStream.AuthenticateAsClient(host);
        client.Close();
        return x509.NotAfter;
    }
}

Использование:

var expirationDate = checker.GetCertificateExpirationDate("www.mydomain.com", 443);
1 голос
/ 05 марта 2011

Код в C # для проверки истечения срока действия сертификата, который делается на стороне сервера и уведомляется в журнале событий
http://awesomeideas.net/page/Cert-Expiry-Check.aspx

Вот версия, использующая vbscript
http://awesomeideas.net/post/How-to-Check-certificate-expiry-for-webserver-(IIS)-certificates-using-script.aspx

Метод Джонаса также хорош, поскольку он использует TCPClient и может использоваться с удаленного компьютера.

1 голос
/ 19 октября 2010

Вы также можете сделать это с помощью Microsoft.Web.Administration, см. этот пост и этот пост блога . Я думаю, что вы должны быть в состоянии отменить это - получить правильный магазин, затем правильный сертификат.

[править] Хм, теперь я озадачен. Я не уверен, что Microsoft.Web.Administration поддерживается для всего, что ниже IIS 7. [/ Edit]

...