Проверьте сертификат сервера с помощью 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 = США
Использовать WebRequestHandler
с надлежащим обратным вызовом проверки сертификата. см., например, HttpClient, HttpClientHandler и WebRequestHandler, объясненные.