Мне не знаком способ выполнения этой проверки с 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.