特定のドメイン名のSSL証明書からデータを取得しようとしています。たとえば、私は任意のウェブサイトアドレスを入れたいです。 " http://stackoverflow.com "そして私のコードは最初にSSL証明書が存在するかどうかをチェックします。もしそうなら、証明書の有効期限を引き出して欲しい。 [DBからドメイン名を読み込んでいます]例: http://www.digicert.com/help/
有効期限を確認するWebサービスを作成する必要があります。どうすれば実装できますか? -RequestCertificateValidationCallbackやClientCertificatesなど、さまざまなものの負荷を調べました。
私は完全に間違っている可能性があります(そのため、なぜヘルプが必要ですか)は、HTTPWebRequestを作成して、クライアント証明書と特定の要素をそのように要求しますか?
@ SSL証明書プリフェッチ.NET の例を試しましたが、forbitten 403エラーが発生します。
これを機能させるには、プロジェクトで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)
{
}
}
}
注意すべきことの1つは、request.AllowAutoRedirect = False
を設定する必要がある場合があることです。そうでない場合、サーバーがHTTPSをHTTPにリダイレクトすると、HttpWebRequest
オブジェクトから証明書を取得できなくなります。
@ 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();
}