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!

71
demandé sur Cuong Le 2012-09-23 18:45:00

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

9
répondu Oren Novotny 2013-09-23 02:15:07

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.

104
répondu Bronumski 2018-06-14 23:13:24

regardez le WebRequestHandler Class et son ServerCertificateValidationCallback Property :

using (var handler = new WebRequestHandler())
{
    handler.ServerCertificateValidationCallback = ...

    using (var client = new HttpClient(handler))
    {
        ...
    }
}
64
répondu dtb 2012-09-23 16:04:52

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)) {
    ...
}
21
répondu dschüsä 2018-03-02 11:26:22

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);
12
répondu ctacke 2017-10-08 01:59:40

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é.

6
répondu Oren Novotny 2013-01-04 23:36:21

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.

2
répondu Laith 2013-02-04 23:38:36

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 /

1
répondu TombMedia 2017-02-24 22:13:55