Отключить проверку сертификата клиента во время запроса через HttpClient - PullRequest
0 голосов
/ 22 февраля 2019

Есть ли способ отключить проверку сертификата клиента во время HTTP-запросов через HttpClient?

Мы хотели бы проверить проверку сертификата клиента с помощью положительных и отрицательных тестов.Поэтому в некоторых случаях мы хотели бы отправить недействительный сертификат клиента (просроченный, недействительный и т. Д.).Однако, когда используется такой сертификат клиента, запрос не может быть отправлен целевому API, или сертификат клиента недействителен для целевого API.

Клиент для отправки HTTP-запроса

var handler = new HttpClientHandler();
var certificateNotValid = new X509Certificate2(@"C:\src\test.pfx", "pass");
handler.ClientCertificates.Add(CertificateNotValid);
var client = new HttpClient(handler);
var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, "https://url");
var result = await client.SendAsync(httpRequestMessage);

Если сертификатчтение из пути как

var certificateNotValid = new X509Certificate2(@"C:\src\test.pfx", "password");,

HTTP-запрос клиента выдает System.Net.Http.HttpRequestException: 'An error occurred while sending the request.'. Win32Exception: The received certificate has expired.

Если сертификат читается из хранилища сертификатов Windows как

X509Certificate2 certificate;
using (var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine))
{
    store.Open(OpenFlags.ReadOnly);
    var certificates = store.Certificates.Find(X509FindType.FindBySubjectName, cn, false);
    certificate = certificates[0];
    store.Close();
}

целевой API получает нулевой сертификат клиента.

Добавление, сервер вызов проверки сертификата делаетне помогает (как на HTTP-клиенте, так и на целевом API).

ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, x509Chain, errors) => { return true; };

Целевой API считывает сертификат клиента как
var clientCertificate = await context.Connection.GetClientCertificateAsync();

...