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

Fab*_*anJ 3 c# ssl ssl-certificate

到目前为止,我可以获得网页 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);
  }
}
Run Code Online (Sandbox Code Playgroud)

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

sta*_*t54 7

这行:

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Run Code Online (Sandbox Code Playgroud)

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

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Run Code Online (Sandbox Code Playgroud)

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


小智 7

用于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;
    }
Run Code Online (Sandbox Code Playgroud)


Ton*_*Nam 6

HttpWebRequest 现已过时。我最终使用了这段代码:

// Create an HttpClientHandler object and set to use default credentials
using var handler = new HttpClientHandler();

// Set custom server validation callback
handler.ServerCertificateCustomValidationCallback = (requestMessage, certificate, x509Chain, SslPolicyErrors) =>
{
    // It is possible inpect the certificate provided by server
    Console.WriteLine($"Requested URI: {requestMessage.RequestUri}");

    if (certificate is null)
        return false;

    Console.WriteLine($"Effective date: {certificate.GetEffectiveDateString()}");
    Console.WriteLine($"Exp date: {certificate.GetExpirationDateString()}");
    Console.WriteLine($"Issuer: {certificate.Issuer}");
    Console.WriteLine($"Subject: {certificate.Subject}");

    return true;
};

// Create an HttpClient object
using var client = new HttpClient(handler);

using HttpResponseMessage response = await client.GetAsync("https://stackoverflow.com/");

// wait for callback
await Task.Delay(10000);
Run Code Online (Sandbox Code Playgroud)