我需要以编程方式在IIS框中确定SSL证书的到期日期。理想情况下,我想在C#中执行此操作,但如果VB脚本是唯一可接受的方式。
环境=> IIS版本6& 7,.NET 2.0,Windows 2003& 2008
由于
答案 0 :(得分:10)
我不熟悉使用VBS和/或WMI进行此检查的方法,因为它可能是一个安全性,因为它可能会暴露私钥。但是,有一种方法可以利用普通的HTTPS连接来获取有关证书的公共信息。如果使用IE连接到任何安全的网站,则可以转到“文件”菜单并查看“属性”,然后单击“证书”按钮。这显示了站点的公共证书信息对话框。您可以使用C#以编程方式获取此信息。
基本上,您需要做的是在端口443上打开与服务器的TCP连接,然后接收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上进行过测试。
答案 1 :(得分:5)
Jonas Gorauskas对解决方案的简化:
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);
答案 2 :(得分:1)
您也应该可以使用Microsoft.Web.Administration执行此操作,请参阅this post和此blog post。我认为你应该能够扭转它 - 获得正确的商店,然后是正确的证书。
[编辑]嗯,我现在感到困惑。我不确定IIS 7以下的任何内容都支持Microsoft.Web.Administration .. [/ edit]
答案 3 :(得分:1)
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
Jonas的方法也很好,因为它使用TCPClient,可以在远程机器上使用。