web-dev-qa-db-ja.com

NETでSSL証明書を取得する

特定のドメイン名のSSL証明書からデータを取得しようとしています。たとえば、私は任意のウェブサイトアドレスを入れたいです。 " http://stackoverflow.com "そして私のコードは最初にSSL証明書が存在するかどうかをチェックします。もしそうなら、証明書の有効期限を引き出して欲しい。 [DBからドメイン名を読み込んでいます]例: http://www.digicert.com/help/

有効期限を確認するWebサービスを作成する必要があります。どうすれば実装できますか? -RequestCertificateValidationCallbackやClientCertificatesなど、さまざまなものの負荷を調べました。

私は完全に間違っている可能性があります(そのため、なぜヘルプが必要ですか)は、HTTPWebRequestを作成して、クライアント証明書と特定の要素をそのように要求しますか?

@ SSL証明書プリフェッチ.NET の例を試しましたが、forbitten 403エラーが発生します。

15
user166013

これを機能させるには、プロジェクトでSystem.Securityへの参照が必要になります。

using System.Security;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;

//Do webrequest to get info on secure site
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://mail.google.com");
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();

//display the cert dialog box
X509Certificate2UI.DisplayCertificate(cert2);

。Net Core 2.1

HttpClientHandler および ServerCertificateCustomValidationCallback プロパティを使用できます。 (このクラスは.net 4.7.1以降でも使用できます)。

var handler = new HttpClientHandler
{
     UseDefaultCredentials = true,

     ServerCertificateCustomValidationCallback = (sender, cert, chain, error) =>
     {

          /// Access cert object.

          return true;
     }
 };

 using (HttpClient client = new HttpClient(handler))
 {
     using (HttpResponseMessage response = await client.GetAsync("https://mail.google.com"))
     {
          using (HttpContent content = response.Content)
          {

          }
      }
 }
26
cdev

注意すべきことの1つは、request.AllowAutoRedirect = Falseを設定する必要がある場合があることです。そうでない場合、サーバーがHTTPSをHTTPにリダイレクトすると、HttpWebRequestオブジェクトから証明書を取得できなくなります。

4
user60177

@ cdev's solution .NET Core 2.1では動作しませんでした。 .NET CoreではHttpWebRequest完全にはサポートされていません のようです。

サーバーのX509証明書を取得するためにon .NET Coreを使用している関数は次のとおりです。

// using System;
// using System.Net.Http;
// using System.Security.Cryptography.X509Certificates;
// using System.Threading.Tasks;

static async Task<X509Certificate2> GetServerCertificateAsync(string url)
{
    X509Certificate2 certificate = null;
    var httpClientHandler = new HttpClientHandler
    {
        ServerCertificateCustomValidationCallback = (_, cert, __, ___) =>
        {
            certificate = cert;
            return true;
        }
    };

    var httpClient = new HttpClient(httpClientHandler);
    await httpClient.SendAsync(new HttpRequestMessage(HttpMethod.Head, url));

    return certificate ?? throw new NullReferenceException();
}
1
Poulad