未经授权检查 SSL 证书到期日期

Check SSL-Certifacte expiration date without authorization

到目前为止,我可以获取网页 SSL 证书的到期日期,而无需使用用户名和密码进行授权:

class Program
{
  static void ReadExpirDate()
  {
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://google.com");
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    response.Close();

    X509Certificate cert = request.ServicePoint.Certificate;
    X509Certificate2 cert2 = new X509Certificate2(cert);

    string cedate = cert2.GetExpirationDateString();
    Console.WriteLine(cedate);
  }
}

但是,如果我尝试获取需要使用用户名和密码授权才能访问的网页的到期日期,我会收到 System.Net.WebException "error:(401) Unauthorized" 异常。 有什么方法可以获取 SSL 证书的到期日期吗?

这一行:

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

实际上是在未经授权地调用指定的Url,这就是抛出异常的地方,如果你这样做那么你可以使用Certificate 属性来自返回的 request 尽管 Exception:

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://google.com");
    X509Certificate cert2 = null;
    HttpWebResponse response =null;

    try {
        response = (HttpWebResponse)request.GetResponse();
        X509Certificate cert = request.ServicePoint.Certificate;
        cert2 = new X509Certificate2(cert);
    } catch {
        X509Certificate cert = request.ServicePoint.Certificate;
        cert2 = new X509Certificate2(cert);
    } finally {
        response.Close();
    }

    if (cert2 != null) {
        string cedate = cert2.GetExpirationDateString();
        Console.WriteLine(cedate);
    }

此代码需要进行一些更好的异常处理和重构,但它应该可以工作。

在授权前使用ServerCertificateValidationCallback获取证书

var request = (HttpWebRequest)WebRequest.Create(GetOptionValue("url"));

request.ServerCertificateValidationCallback += delegate
    (object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
     System.Security.Cryptography.X509Certificates.X509Chain chain,
     System.Net.Security.SslPolicyErrors sslPolicyErrors)
    {
         string expirationDate = certificate.GetExpirationDateString();
         return true;
    }