Flurl e certificados não confiáveis

votos
1

Atualmente eu trabalhei em Flurl e eu tentei entrar em contato com uma API em https (eu sou no meu laboratório). Então, o certificado não é válido e Flurl não pode continuar a trabalhar: /

Aqui é a minha mensagem de erro:

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.

Na documentação Flurl podemos usar using Flurl.Http.Configuration;e modificar o DefaultHttpClientFactoryNo entanto eu não entendo os elementos especificados dizer do pulou sobre os erros.

Na web eu posso ver o mesmo caso: https://github.com/tmenier/Flurl/issues/365 Você tem um problema para este problema?

Obrigado!

Publicado 19/12/2018 em 14:14
fonte usuário
Em outras línguas...                            


2 respostas

votos
2

A maneira mais comum de fazer isso é criar uma fábrica de costume :

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

Em seguida, registrá-lo em algum lugar em sua inicialização do aplicativo:

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

Flurl reutiliza a mesma HttpClientinstância por host por padrão, então configurando desta forma significa que cada chamada para theapi.compermitirá o uso do certificado não confiável. A vantagem deste sobre passando um HttpClienta um FlurlClientconstrutor é que ele mantém essa configuração "para o lado" e funciona quando você usa Flurl na forma mais típica / menos detalhada:

await "https://theapi.com/endpoint".GetJsonAsync();
Respondeu 21/12/2018 em 13:24
fonte usuário

votos
1

Aqui está minha configuração para Flurl, que trabalha com certificados não confiáveis:

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>();

Eu criei HttpClientHandler personalizado que aceita todos os certificados no ServerCertificateCustomValidationCallback. Claro, você pode usar outra lógica nesse manipulador.

Update: Com esta configuração, você não pode usar extensões Flurl para URL (você não pode escrever "http://myadress.com/apiInfo".GetJsonAsync<ApiInfoDto>(). Você tem que criar cliente Flurl como visto acima e usar o cliente Flurl para as suas chamadas como demonstrado também no meu código O uso é o mesmo como extensões Flurl para. URL.

Respondeu 20/12/2018 em 19:55
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more