Есть ли способ отключить проверку сертификата клиента во время 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();