Отключить проверку сертификата SSL в введенном по умолчанию IHttpClientFactory - PullRequest
0 голосов
/ 12 июля 2020

В Startup.cs я ввожу службу IHttpClientFactory:

services.AddHttpClient();

Затем я могу создать новый HttpClient через

public MyClass(IHttpClientFactory httpClientFactory, IOptions<MyClassOptions> options)
{
    _httpClient = httpClientFactory.CreateClient();
    // ...
}

MyClass имеет доступ к API ; базовый URL-адрес передается в объекте options.

Для тестирования я установил фиктивный экземпляр API, который использует самозаверяющий сертификат SSL. К сожалению, этот сертификат (правильно) признан недействительным:

System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception.
 ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.

Как отключить проверку сертификата на заводском уровне, т.е. непосредственно в методе ConfigureServices?

Я нашел этот вопрос , но, похоже, использовалась некоторая пользовательская реализация HttpClient (?), А я хочу выбрать вариант по умолчанию. Следующее не работает (DI выбирает неправильный конструктор и впоследствии терпит неудачу):

services.AddHttpClient<IMyClass, MyClass>();

Этот ответ предлагает указать имя для настроенного HttpClient, но он передает некоторые маги Строка c, которой я бы хотел избежать (MyClass находится в библиотеке классов, предназначенной для использования другими). Отсутствие имени также не работает, поскольку AddHttpClient тогда просто возвращает объект IServiceCollection.

1 Ответ

0 голосов
/ 14 июля 2020

Я разобрался сейчас. Мы можем применить этот ответ для изменения основного HttpMessageHandler значения по умолчанию HttpClient:

services.AddHttpClient(Options.DefaultName, c =>
{
    // ...
}).ConfigurePrimaryHttpMessageHandler(() =>
{
    return new HttpClientHandler
    {
        ClientCertificateOptions = ClientCertificateOption.Manual,
        ServerCertificateCustomValidationCallback =
            (httpRequestMessage, cert, certChain, policyErrors) => true
    };
});

Это даст HttpClient объектов с отключенной проверкой SSL всякий раз, когда по умолчанию IHttpClientFactory вводится.

...