2017-10-29 4 views
1

URLからディスクにすべての証明書を保存します。したがって、たとえばC#Webサイトからすべてのhttps証明書をダウンロードする

このページをFirefoxで参照すると、3つの証明書が表示されます。 enter image description here

Firefoxですべてエクスポートしてディスクに保存できます。

だから私はC#でそれをしたいと思います。 、私はちょうど1つの証明書を取得されて、私は次のコードで証明書を取得し始め ...

/// <summary> 
    /// Get and write certificate from URL into file in path 
    /// </summary> 
    /// <param name="_URL">URL of website with certficate</param> 
    /// <param name="_path">Path where you want to store certificate</param> 
    private static void SaveCertificate(String _URL, String _path) 
    { 
     try 
     { 
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_URL); 
      request.AllowAutoRedirect = false; 

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

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

      File.WriteAllText(_path, ExportToPEM(cert)); 
     } 
     catch (Exception) 
     { 
     } 
    } 

    /// <summary> 
    /// Export a certificate to a PEM format string 
    /// </summary> 
    /// <param name="_cert">The certificate to export</param> 
    /// <returns>A PEM encoded string</returns> 
    public static string ExportToPEM(X509Certificate2 _cert) 
    { 
     StringBuilder builder = new StringBuilder(); 

     try 
     { 
      builder.AppendLine("-----BEGIN CERTIFICATE-----"); 
      builder.AppendLine(Convert.ToBase64String(_cert.Export(X509ContentType.Cert), Base64FormattingOptions.InsertLineBreaks)); 
      builder.AppendLine("-----END CERTIFICATE-----"); 

     } 
     catch (Exception) 
     { 
     } 

     return builder.ToString(); 
    } 

このコードの問題は、3をexept。 (私が取得した証明書は、firefoxのスクリーンショットのマーク付き証明書です)

私はここから解決策を試しましたSO Questionしかし、それは私のために働いていません。

私の質問は、どのようにURLからすべての証明書を取得できますか?

答えて

2

証明書チェーンを取得する方法の1つは、requestServerCertificateValidationCallbackを実装することです。

これは、パラメータを受け付ける関数です:これは、通常、証明書とチェーンを検証するために使用されるが、この場合には、我々は単に証明書チェーンへのアクセスを得るためにそれを使用している

(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)

。それはですはハックのように感じるが、それは動作するはずです。投稿されたコードに基づいて概念の証明を実装しました。コードは証明書をコンソールウィンドウに出力します。

public static void Main(string[] args) 
    { 
     SaveCertificate("https://www.google.de", ""); 
    } 
    /// <summary> 
    /// Get and write certificate from URL into file in path 
    /// </summary> 
    /// <param name="_URL">URL of website with certficate</param> 
    /// <param name="_path">Path where you want to store certificate</param> 
    private static void SaveCertificate(string url, string path) 
    { 

      var request = (HttpWebRequest)WebRequest.Create(url); 
      request.AllowAutoRedirect = false; 
      request.ServerCertificateValidationCallback = ServerCertificateValidationCallback; 

      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      response.Close(); 
      Console.ReadLine(); 

    } 

    private static bool ServerCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
    { 
     foreach (var cer in chain.ChainElements) 
     { 
      Console.WriteLine(cer.Certificate.FriendlyName); 
      Console.WriteLine(ExportToPem(cer.Certificate)); 
     } 

     return true; 
    } 

    /// <summary> 
    /// Export a certificate to a PEM format string 
    /// </summary> 
    /// <param name="_cert">The certificate to export</param> 
    /// <returns>A PEM encoded string</returns> 
    public static string ExportToPem(X509Certificate2 cert) 
    { 
     StringBuilder builder = new StringBuilder(); 

     try 
     { 
      builder.AppendLine("-----BEGIN CERTIFICATE-----"); 
      builder.AppendLine(Convert.ToBase64String(cert.Export(X509ContentType.Cert), Base64FormattingOptions.InsertLineBreaks)); 
      builder.AppendLine("-----END CERTIFICATE-----"); 

     } 
     catch (Exception) 
     { 
     } 

     return builder.ToString(); 
    } 
関連する問題