Flurl и недоверенные сертификаты - PullRequest
0 голосов
/ 19 декабря 2018

В настоящее время я работал над Flurl и пытался связаться с API в https (я в своей лаборатории).Таким образом, сертификат недействителен, и Flurl не может продолжать работать: /

Вот мое сообщение об ошибке:

Unhandled Exception: System.AggregateException: One or more errors occurred. (Call failed. The SSL connection could not be established, see inner exception. POST https://IP/api/aaaLogin.json) ---> Flurl.Http.FlurlHttpException: Call failed. The SSL connection could not be established, see inner exception. POST https://IP/api/aaaLogin.json ---> 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.

В документации Flurl мы можем использовать using Flurl.Http.Configuration; и изменять DefaultHttpClientFactory Однако я не понимаю, какие элементы, указанные, скажем, перепрыгнули через ошибки.

В Интернете я вижу такой же случай: https://github.com/tmenier/Flurl/issues/365 У вас есть проблема для этой проблемы?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Наиболее типичный способ сделать это - создать собственную фабрику :

public class UntrustedCertClientFactory : DefaultHttpClientFactory
{
    public override HttpMessageHandler CreateMessageHandler() {
        return new HttpClientHandler {
            ServerCertificateCustomValidationCallback = (a, b, c, d) => true
        };
    }
}

Затем зарегистрировать ее где-нибудь при запуске приложения:

FlurlHttp.ConfigureClient("https://theapi.com", cli =>
    cli.Settings.HttpClientFactory = new UntrustedCertClientFactory());

Flurl по умолчанию использует один и тот же экземпляр HttpClient для каждого хоста, поэтому настройка этого способа означает, что каждый вызов theapi.com позволит использовать недоверенный сертификат.Преимущество этого перед передачей HttpClient конструктору FlurlClient заключается в том, что он сохраняет эту конфигурацию «в стороне» и работает, когда вы используете Flurl более типичным / менее многословным способом:

await "https://theapi.com/endpoint".GetJsonAsync();
0 голосов
/ 20 декабря 2018

Вот моя настройка для Flurl, которая работает с ненадежными сертификатами:

HttpClientHandler httpClientHandler = new HttpClientHandler();
httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, 
  errors) => true;
HttpClient httpClient = new HttpClient(httpClientHandler);
httpClient.BaseAddress = new Uri("https://myaddress.com");
var flurlClient = new FlurlClient(httpClient);

var apiInfo = await flurlClient.Request("apiInfo").GetJsonAsync<ApiInfoDto>();

Я создал собственный HttpClientHandler, который принимает каждый сертификат в ServerCertificateCustomValidationCallback.Конечно, вы можете использовать другую логику в этом обработчике.

Обновление: При этой настройке вы не можете использовать расширения Flurl для URL (вы не можете писать "http://myadress.com/apiInfo".GetJsonAsync<ApiInfoDto>(). Вы должны создать Flurlклиент, как показано выше, и используйте клиент Flurl для ваших звонков, как показано в моем коде. Использование такое же, как расширения Flurl для URL.

...