Estou lutando para fazer meu aplicativo Windows 8 se comunicar com minha API da web de teste por SSL.
Parece que HttpClient / HttpClientHandler não fornece uma opção para ignorar certificados não confiáveis como o WebRequest permite que você (embora de uma forma "hacky" com ServerCertificateValidationCallback
).
Qualquer ajuda seria muito apreciada!
c#
.net
windows-8
windows-runtime
Jamie
fonte
fonte
Respostas:
Com o Windows 8.1, agora você pode confiar em certificados SSL inválidos. Você deve usar o Windows.Web.HttpClient ou, se quiser usar o System.Net.Http.HttpClient, pode usar o adaptador do manipulador de mensagens que escrevi: http://www.nuget.org/packages/WinRtHttpClientHandler
Os documentos estão no GitHub: https://github.com/onovotny/WinRtHttpClientHandler
fonte
Uma solução rápida e suja é usar o
ServicePointManager.ServerCertificateValidationCallback
delegado. 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.Eu uso isso principalmente para testes de unidade em situações em que desejo executar em um ponto de extremidade que estou hospedando em processo e estou tentando atingi-lo com um cliente WCF ou o
HttpClient
.Para código de produção, você pode desejar um controle mais refinado e seria melhor usar a propriedade
WebRequestHandler
e suaServerCertificateValidationCallback
delegação (consulte a resposta de dtb abaixo ). Ou selecione a resposta usandoHttpClientHandler
. Estou preferindo qualquer um desses dois agora, mesmo com meus testes de integração, em vez de como costumava fazer, a menos que não consiga encontrar nenhum outro gancho.fonte
ServicePointManager.GetServicePoint(Uri)
(consulte os documentos ) para obter o ponto de serviço que se aplica apenas a chamadas para esse URI. Em seguida, você pode definir propriedades e manipular eventos com base nesse subconjunto.Dê uma olhada na classe WebRequestHandler e sua propriedade ServerCertificateValidationCallback :
fonte
derived class
?HttpClientHandler
?Se você está tentando fazer isso em uma biblioteca .NET Standard, aqui está uma solução simples, com todos os riscos de apenas retornar
true
em seu manipulador. Deixo a segurança com você.fonte
Ou você pode usar para o HttpClient no
Windows.Web.Http
namespace:fonte
System.Net.Http
,System.Web
eWindows.Web.Http
juntos?Se você estiver usando
System.Net.Http.HttpClient
, acredito que o padrão correto éfonte
A maioria das respostas aqui sugere o uso do padrão típico:
por causa da interface IDisposable. Por favor, não!
A Microsoft explica por quê:
E aqui você pode encontrar uma análise detalhada do que está acontecendo nos bastidores: https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
Com relação à sua pergunta SSL e com base em https://docs.microsoft.com/en-us/azure/architecture/antipatterns/improper-instantiation/#how-to-fix-the-problem
Aqui está o seu padrão:
fonte
Se for para um aplicativo do Windows Runtime, você precisará adicionar o certificado autoassinado ao projeto e fazer referência a ele no appxmanifest.
Os documentos estão aqui: http://msdn.microsoft.com/en-us/library/windows/apps/hh465031.aspx
A mesma coisa se for de uma CA 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.
fonte
Não tenho uma resposta, mas tenho uma alternativa.
Se você usar o Fiddler2 para monitorar o tráfego E habilitar a descriptografia HTTPS, seu ambiente de desenvolvimento não 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 de desenvolvimento ficará bem.
Para habilitar a criptografia HTTPS no Fiddler2, vá para Ferramentas> Opções do Fiddler> HTTPS (guia)> Marque "Descriptografar tráfego HTTPS" .
Vou ficar de olho neste tópico esperando que alguém tenha uma solução elegante.
fonte
Encontrei um exemplo neste cliente Kubernetes em que eles estavam usando X509VerificationFlags.AllowUnknownCertificateAuthority para confiar em certificados raiz autoassinados autoassinados. Refiz um pouco o exemplo deles para trabalhar com nossos próprios certificados raiz codificados PEM. Espero que isso ajude alguém.
fonte
Encontrei um exemplo online que parece funcionar bem:
Primeiro você cria um novo ICertificatePolicy
Em seguida, use isso antes de enviar sua solicitação http, da seguinte forma:
http://www.terminally-incoherent.com/blog/2008/05/05/send-a-https-post-request-with-c/
fonte
ServicePointManager.CertificatePolicy
está obsoleto: docs.microsoft.com/en-us/dotnet/framework/whats-new/…