Как мне использовать сертификат с HttpClient? - PullRequest
0 голосов
/ 10 ноября 2019

Мне нужно использовать веб-API от одного из наших партнеров. Их API требует, чтобы я использовал сертификат для подключения.

Я не хочу устанавливать сертификат на наших серверах (ВМ). Это контрпродуктивно для нашей стратегии сервера Phoenix.

Я пытаюсь использовать сертификат программно. Проблема в том, что я получаю сообщение об ошибке:

AuthenticationException: удаленный сертификат недействителен в соответствии с процедурой проверки.

Я создаю HttpClient, используя этот код:

_certificate = new X509Certificate2(_certificateFile);
var handler = new WebRequestHandler();
handler.ClientCertificates.Add(_certificate);
var client = new HttpClient(handler) { BaseAddress = new Uri(_url) };

Я могу заставить его работать, переопределив проверки сертификатов:

ServicePointManager.ServerCertificateValidationCallback += delegate { return true; };

Но это выглядит как плохой стиль.

Я проверил, что моя конечная точка соответствует CN всертификат

Является ли AuthenticationException просто потому, что сертификат не установлен в хранилище сертификатов?

Если да, могу ли я временно с помощью кода установить сертификат и удалить его после?

1 Ответ

1 голос
/ 10 ноября 2019

«Удаленный сертификат недействителен» означает, что .NET Framework считает, что сертификат на стороне сервера веб-службы вашего партнера недействителен (вполне нормально, если у вас не установлены необходимые корневые / промежуточные сертификаты).

Вы можете отменить проверку по умолчанию, изменив ServerCertificateValidationCallback, но вы должны реализовать свою собственную, чтобы убедиться, что вы действительно проверяете их сертификат, чтобы избежать атак.

Вы также должны использовать HttpClientHandler.ServerCertificateValidationCallback, чтобыВаш пользовательский валидатор вступает в силу только в рамках этого конкретного экземпляра HttpClient, но не влияет на другие части вашего приложения,

https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclienthandler.servercertificatecustomvalidationcallback?view=netframework-4.8

Однако сертификат, который они вам дали (обычносертификат клиента) проверяется их веб-службой, а не локально на вашем компьютере.

...