Autoriser les certificats SSL non fiables avec HttpClient
j'ai du mal à obtenir que mon application Windows 8 communique avec mon API de test web sur SSL.
il semble que HttpClient/HttpClientHandler ne fournit pas et option d'ignorer les certificats non fiables comme WebRequest vous le permet (bien que d'une manière" hacky "avec ServerCertificateValidationCallback
).
toute aide serait très appréciée!
8 réponses
avec Windows 8.1, vous pouvez maintenant faire confiance à des certificats SSL invalides. Vous devez utiliser les fenêtres.Web.HttpClient ou si vous souhaitez utiliser le système.Net.Http.HttpClient, vous pouvez utiliser l'adaptateur de gestionnaire de messages que j'ai écrit: http://www.nuget.org/packages/WinRtHttpClientHandler
Les Docs sont sur le GitHub: https://github.com/onovotny/WinRtHttpClientHandler
une solution rapide et sale est d'utiliser le ServicePointManager.ServerCertificateValidationCallback
délégué. Cela vous permet de fournir votre propre certificat de validation. La validation est appliquée globalement à l'ensemble du domaine App.
ServicePointManager.ServerCertificateValidationCallback +=
(sender, cert, chain, sslPolicyErrors) => true;
Je l'utilise principalement pour des tests unitaires dans des situations où je veux courir contre un point final que j'héberge dans le processus et que j'essaie de le frapper avec un client WCF 151980920" ou le HttpClient
.
pour le code de production, vous pouvez vouloir un contrôle plus fin et serait mieux d'utiliser la WebRequestHandler
et son ServerCertificateValidationCallback
propriété déléguée (voir réponse de dtb ci-dessous ). Ou ctacke réponse à l'aide de la HttpClientHandler
. Je préfère l'un ou l'autre de ces deux systèmes maintenant, même avec mes tests d'intégration, plutôt que la façon dont je le faisais avant, à moins que ne peut pas trouver un autre crochet.
regardez le WebRequestHandler Class et son ServerCertificateValidationCallback Property :
using (var handler = new WebRequestHandler())
{
handler.ServerCertificateValidationCallback = ...
using (var client = new HttpClient(handler))
{
...
}
}
ou vous pouvez utiliser pour le HttpClient dans le Windows.Web.Http
namespace:
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)) {
...
}
si vous tentez de faire cela dans une bibliothèque standard de .NET, voici une solution simple, avec tous les risques de retourner true
dans votre gestionnaire. Je laisse de sécurité jusqu'à vous.
var handler = new HttpClientHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.ServerCertificateCustomValidationCallback =
(httpRequestMessage, cert, cetChain, policyErrors) =>
{
return true;
};
var client = new HttpClient(handler);
si c'est pour une application Windows Runtime, alors vous devez ajouter le certificat auto-signé au projet et le référencer dans l'appxmanifest.
les docs sont ici: http://msdn.microsoft.com/en-us/library/windows/apps/hh465031.aspx
même chose si c'est d'une CA qui n'est pas fiable (comme une CA privée que la machine elle-même ne fait pas confiance) -- vous devez obtenir le certificat public de L'AC, l'ajouter comme contenu à l'application l'ajoute ensuite au manifeste.
une fois que ce sera fait, l'application le verra comme un certificat correctement signé.
Je n'ai pas de réponse, mais j'ai une alternative.
si vous utilisez Fiddler2 pour surveiller le trafic et activer le décryptage HTTPS, votre environnement de développement ne se plaindra pas. Cela ne fonctionnera pas sur les appareils WinRT, tels que Microsoft Surface, parce que vous ne pouvez pas installer des applications standard sur eux. Mais votre ordinateur de développement Win8 sera très bien.
pour activer le cryptage HTTPS dans Fiddler2, allez à outils > Options Fiddler > HTTPS (Tab) > cochez "Decrypt HTTPS Traffic" .
je vais garder mes yeux sur ce fil en espérant que quelqu'un ai une solution élégante.
j'ai trouvé un exemple en ligne qui semble bien fonctionner:
vous créez D'abord un nouveau 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;
}
}
ensuite, il vous suffit d'utiliser ce avant d'envoyer votre demande http comme suit:
System.Net.ServicePointManager.CertificatePolicy = new MyPolicy();
http://www.terminally-incoherent.com/blog/2008/05/05/send-a-https-post-request-with-c /