Проверьте сертификат сервера с помощью HttpClient

Я переписываю некоторый код веб-обработки в WinForms и переключаюсь с HttpWebRequest на HttpClient. Есть еще одна вещь, которая мне нужна, и я не могу понять, как это сделать.

В HttpWebRequest я могу получить сертификат с веб-сервера, к которому я подключаюсь, и отобразить его:

...
HttpWebRequest request = CreateHttpRequest(destUri);

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

cert = request.ServicePoint.Certificate;

if (cert != null) 
{ 
  cert2 = new X509Certificate2(cert); 
  X509Certificate2UI.DisplayCertificate(cert2);
}
...

Я не могу найти эквивалентный способ получения сертификата с помощью HttpClient:

//... Use HttpClient.
using (HttpClient client = new HttpClient())
{
  using (HttpResponseMessage response = await client.GetAsync(destUri))
  {
    using (HttpContent content = response.Content)
    {
      string result = await content.ReadAsStringAsync();
    }
  }
}

Как / где я могу сделать это здесь? Я не знаю, как добраться до ServicePoint.Certificate.

3 ответа

Решение

По-видимому, вам не нужно получать сертификат от ServicePointManager.ServerCertificateValidationCallback. Вы можете найти его в самом ServicepointManager, например так:

//... Use HttpClient.
using (HttpClient client = new HttpClient())
{
  using (HttpResponseMessage response = await client.GetAsync(destUri))
  {
    // Get Certificate Here
    var cert = ServicePointManager.FindServicePoint(destUri).Certificate;
    //
    using (HttpContent content = response.Content)
    {
      string result = await content.ReadAsStringAsync();
    }
  }
}

Построение ответа Remus - вот что я выложил в LinqPad, который дает вам доступ к вашему сертификату:

var handler = new WebRequestHandler();
handler.UseDefaultCredentials = true;
handler.AllowPipelining = true;
handler.ServerCertificateValidationCallback =  (sender, cert, chain, error) => {
    //do something with cert here
    cert.Subject.Dump();
    //useless validation on my part
    return true;
};


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

Dump() выходы следующие:

CN = *. Google.com, O=Google Inc, L= Маунтин-Вью, S = Калифорния, C = США

CN = www.google.de, O = Google Inc, L = Маунтин-Вью, S = Калифорния, C = США

CN = www.google.com, O=Google Inc, L= Маунтин-Вью, S = Калифорния, C = США

Другие вопросы по тегам