Permitindo Certificados SSL Não Confiáveis ​​com o HttpClient

Estou com dificuldades para que meu aplicativo do Windows 8 se comunique com minha API da web de teste por meio de SSL.

Parece que HttpClient / HttpClientHandler não fornece e opção para ignorar certificados não confiáveis ​​como WebRequest permite que você (embora de uma maneira “hacky” com ServerCertificateValidationCallback ).

Qualquer ajuda seria muito apreciada!

    Com o Windows 8.1, agora você pode confiar em certificados SSL inválidos. Você tem que usar o Windows.Web.HttpClient ou se você quiser usar o System.Net.Http.HttpClient, você pode usar o adaptador de manipulador de mensagens que eu escrevi: http://www.nuget.org/packages/WinRtHttpClientHandler

    Os documentos estão no GitHub: https://github.com/onovotny/WinRtHttpClientHandler

    Uma solução rápida e suja é usar o representante ServicePointManager.ServerCertificateValidationCallback . Isso permite que você forneça sua própria validação de certificado. A validação é aplicada globalmente em todo o domínio do aplicativo.

     ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true; 

    Eu uso isso principalmente para teste de unidade em situações onde eu quero executar em um ponto de extremidade que estou hospedando no processo e estou tentando acertar com um cliente WCF ou o HttpClient .

    Para o código de produção, você pode querer um controle mais refinado e seria melhor usar o WebRequestHandler e sua propriedade de delegado ServerCertificateValidationCallback (Veja a resposta do dtb abaixo ). Ou ctacke responder usando o HttpClientHandler . Eu estou preferindo qualquer um desses dois agora mesmo com meus testes de integração sobre como eu costumava fazê-lo, a menos que eu não consiga encontrar nenhum outro gancho.

    Dê uma olhada na class WebRequestHandler e sua propriedade ServerCertificateValidationCallback :

     using (var handler = new WebRequestHandler()) { handler.ServerCertificateValidationCallback = ... using (var client = new HttpClient(handler)) { ... } } 

    Ou você pode usar para o HttpClient no namespace Windows.Web.Http :

     var filter = new HttpBaseProtocolFilter(); #if DEBUG filter.IgnorableServerCertificateErrors.Add(ChainValidationResult.Expired); filter.IgnorableServerCertificateErrors.Add(ChainValidationResult.Untrusted); filter.IgnorableServerCertificateErrors.Add(ChainValidationResult.InvalidName); #endif using (var httpClient = new HttpClient(filter)) { ... } 

    Se você está tentando fazer isso em uma biblioteca padrão do .NET, aqui está uma solução simples, com todos os riscos de apenas retornar true em seu manipulador. Eu deixo segurança para você.

     var handler = new HttpClientHandler(); handler.ClientCertificateOptions = ClientCertificateOption.Manual; handler.ServerCertificateCustomValidationCallback = (httpRequestMessage, cert, cetChain, policyErrors) => { return true; }; var client = new HttpClient(handler); 

    Se for para um aplicativo do Tempo de Execução do Windows, você deverá adicionar o certificado autoassinado ao projeto e referenciá-lo no appxmanifest.

    Os documentos estão aqui: http://msdn.microsoft.com/pt-br/library/windows/apps/hh465031.aspx

    A mesma coisa se for de uma CA que não é confiável (como uma CA privada na qual a própria máquina não confia) – você precisa obter o certificado público da CA, adicioná-lo como conteúdo ao aplicativo e adicioná-lo ao manifesto.

    Feito isso, o aplicativo o verá como um certificado assinado corretamente.

    Eu não tenho uma resposta, mas tenho uma alternativa.

    Se você usar o Fiddler2 para monitorar o tráfego E ativar a Descriptografia HTTPS, seu ambiente de desenvolvimento não irá reclamar. Isso não funcionará em dispositivos WinRT, como o Microsoft Surface, porque você não pode instalar aplicativos padrão neles. Mas o seu computador Win8 desenvolvimento estará bem.

    Para ativar a criptografia HTTPS no Fiddler2, vá para Ferramentas> Opções do Fiddler> HTTPS (Tabulação)> Verificar “Descriptografar tráfego HTTPS” .

    Vou ficar de olho neste tópico esperando que alguém tenha uma solução elegante.

    Eu encontrei um exemplo online que parece funcionar bem:

    Primeiro você cria um novo ICertificatePolicy

     using System.Security.Cryptography.X509Certificates; using System.Net; public class MyPolicy : ICertificatePolicy { public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem) { //Return True to force the certificate to be accepted. return true; } } 

    Então é só usar isso antes de enviar sua solicitação http da seguinte forma:

     System.Net.ServicePointManager.CertificatePolicy = new MyPolicy(); 

    http://www.terminally-incoherent.com/blog/2008/05/05/send-a-https-post-request-with-c/