【问题标题】:obtain ssl certificate information - .net获取 ssl 证书信息 - .net
【发布时间】:2013-03-11 09:43:23
【问题描述】:

我希望从任何给定的域名 SSL 证书中获取数据。例如,我想输入任何网站地址,例如“http://stackoverflow.com”,我的代码将首先检查 SSL 证书是否存在。如果是这样,那么我希望它提取证书的到期日期。 [我正在从数据库中读取域名] 示例:http://www.digicert.com/help/

我需要创建一个网络服务来检查到期日期。我该如何实施? - 我查看了很多不同的东西,例如 RequestCertificateValidationCallback 和 ClientCertificates 等。由于我是新手,我不确定要做什么。

我可能完全错了(因此我需要帮助),但我会创建一个 HTTPWebRequest,然后以某种方式请求客户端证书和特定元素吗?

我尝试了提供 @SSL 证书预取 .NET 的示例,但我遇到了被禁止的 403 错误。

任何帮助将不胜感激 - 谢谢。

这是我编写的抛出 403 禁止错误的代码。

        Uri u = new Uri("http://services.efi.com/");
        ServicePoint sp = ServicePointManager.FindServicePoint(u);

        string groupName = Guid.NewGuid().ToString();
        HttpWebRequest req = HttpWebRequest.Create(u) as HttpWebRequest;
        req.Accept = "*/*";
        req.ConnectionGroupName = groupName;

        using (WebResponse resp = req.GetResponse())
        {
            // Ignore response, and close the response.
        }
        sp.CloseConnectionGroup(groupName);

        // Implement favourite null check pattern here on sp.Certificate
        string expiryDate = sp.Certificate.GetExpirationDateString();

        string str = expiryDate;

【问题讨论】:

    标签: c# ssl-certificate


    【解决方案1】:

    这很好用:

    namespace ConsoleApplication1
    {
      using System;
      using System.Net;
      using System.Net.Security;
      using System.Security.Cryptography.X509Certificates;
    
      class Program
      {
        static void Main()
        {
          ServicePointManager.ServerCertificateValidationCallback += ServerCertificateValidationCallback;
    
          var request = WebRequest.Create("https://www.google.com");
    
          var response = request.GetResponse();
    
          Console.WriteLine("Done.");
          Console.ReadLine();
    
        }
    
        private static bool ServerCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
          Console.WriteLine("Certificate expires on " + certificate.GetExpirationDateString());
    
          return true;
        }
      }
    }
    

    【讨论】:

    • 当我尝试使用我的域名时,即webapps.efi.internal,它会抛出 403 禁止错误。实际上,在我的例子中,webapps 是服务器的名称,在该服务器下托管了许多网站。
    【解决方案2】:

    您将获得“403 禁止”状态,因为这是您访问该页面时服务器返回的状态。当我使用 IE 浏览到该 Uri 时,我看到了同样的事情。此状态表明您无权访问该 Url,因此也许您应该在您有权访问的页面上尝试您的代码。

    此外,您不太可能在 http 连接上看到证书 - 您可能想改用 https

    【讨论】:

    • 我尝试使用services.efi.com,但仍然抛出 403 错误。当我使用'ipp.efi.com'时,它工作得很好。
    • 是的,因为后者的 Url 是可公开访问的(并且还会自动重定向到 https),而前者不是。如果你不能在 IE 中浏览到它,你也不能从代码中加载它。您根本无法访问services.efi.com(除非您拥有我们没有的凭据或访问方式!)。也许您需要一个特定的页面 Uri 而不仅仅是该域的域名...
    • 哦,好的,谢谢您的回复 :)..在我的域(比如 services.efi.com)下有许多网站托管。我的要求是确定 SSL 到期日期并采取必要的措施行动(比如发送邮件,如果到期日期在大约 20 天后)。那么如何获取我域的 SSL 证书信息呢?
    • 从站点内部处理此问题可能比从外部访问站点更容易。但是,如果您必须在外部处理,那么您将需要域上可从域外部访问的特定 Uri(例如,“services.efi.com/homepage.aspx”或其他将在 IE 中实际呈现的页面)。
    • 非常感谢:)帮助。当我尝试提供可从外部域访问的网址时,正如您提到的那样,它运行良好..
    【解决方案3】:

    如果需要下载证书:

                //Do webrequest to get info on secure site
            var certName = "FileName";
            var url = "https://mail.google.com";
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            response.Close();
    
            //retrieve the ssl cert and assign it to an X509Certificate object
            X509Certificate cert = request.ServicePoint.Certificate;
    
            //convert the X509Certificate to an X509Certificate2 object by passing it into the constructor
            X509Certificate2 cert2 = new X509Certificate2(cert);
    
            string cn = cert2.GetIssuerName();
            string cedate = cert2.GetExpirationDateString();
            string cpub = cert2.GetPublicKeyString();
    
            var path = Directory.GetCurrentDirectory() + string.Concat("\\", certName, ".der");
            byte[] certData = cert2.Export(X509ContentType.Cert);
            File.WriteAllBytes(path, certData);
    
            Console.WriteLine("cert2.GetIssuerName :{0}", cert2.GetIssuerName());
            Console.WriteLine("cert2.GetExpirationDateString :{0}", cert2.GetExpirationDateString());
            Console.WriteLine("cert2.GetPublicKeyString :{0}", cert2.GetPublicKeyString());
    

    .cs 示例文件:https://gist.github.com/thedom85/6db200104c075310527aaef63b172253

    我也推荐这个网站:https://www.simple-talk.com/dotnet/.net-framework/tlsssl-and-.net-framework-4.0/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-13
      • 2015-09-25
      • 2019-02-10
      • 2014-06-16
      • 2018-07-07
      • 2019-10-08
      • 2013-02-22
      • 2011-01-31
      相关资源
      最近更新 更多