87 votes

Contourner les erreurs de certificat SSL invalide lors de l'appel de services web en .Net

Nous mettons en place un nouveau SharePoint pour lequel nous n'avons pas encore de certificat SSL valide. J'aimerais appeler le service Web Lists pour récupérer certaines métadonnées sur la configuration. Cependant, lorsque j'essaie de le faire, j'obtiens l'exception suivante :

La connexion sous-jacente a été fermée : Impossible d'établir une relation de confiance pour le canal sécurisé SSL/TLS.

L'exception imbriquée contient le message d'erreur :

Le certificat distant n'est pas valide selon la procédure de validation.

Ceci est correct puisque nous utilisons un certificat temporaire.

Ma question est la suivante : comment puis-je dire au client du service web .Net ( Protocole SoapHttpClientProtocol ) pour ignorer ces erreurs ?

114voto

Vous pouvez également enregistrer un délégué de rappel qui ignore l'erreur de certification :

...
ServicePointManager.ServerCertificateValidationCallback = MyCertHandler;
...

static bool MyCertHandler(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors error)
{
// Ignore errors
return true;
}

79voto

Keith Sirmons Points 2558

Comme la réponse de Jason S :

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

Je mets ça dans mon Main et je regarde vers mon app.config et tester si (ConfigurationManager.AppSettings["IgnoreSSLCertificates"] == "True") avant d'appeler cette ligne de code.

24voto

imanabidi Points 3203

Je l'ai résolu de cette façon :

Appelez ce qui suit juste avant d'appeler votre webservice ssl qui cause cette erreur :

using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;

/// <summary>
/// solution for exception
/// System.Net.WebException: 
/// The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel. ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.
/// </summary>
public static void BypassCertificateError()
{
    ServicePointManager.ServerCertificateValidationCallback +=

        delegate(
            Object sender1,
            X509Certificate certificate,
            X509Chain chain,
            SslPolicyErrors sslPolicyErrors)
        {
            return true;
        };
}

18voto

Simon Johnson Points 4641

L'approche que j'ai utilisée face à ce problème a été d'ajouter le signataire du certificat temporaire à la liste des autorités de confiance sur l'ordinateur en question.

Je fais normalement des tests avec des certificats créés avec CACERT, et les ajouter à ma liste d'autorités de confiance a fonctionné à merveille.

En procédant ainsi, vous n'avez pas à ajouter de code personnalisé à votre application et vous simulez correctement ce qui se passera lorsque votre application sera déployée. En tant que tel, je pense que c'est une solution supérieure à la désactivation programmatique de la vérification.

11voto

Dinesh Rajan Points 339

J'avais la même erreur en utilisant DownloadString ; et j'ai réussi à la faire fonctionner comme ci-dessous grâce aux suggestions de cette page.

System.Net.WebClient client = new System.Net.WebClient();            
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
string sHttpResonse = client.DownloadString(sUrl);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X