Contourner les erreurs de certificat SSL non valides lors de l'appel de services Web dans .Net

87

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

La connexion sous-jacente a été fermée: impossible d'établir une relation d'approbation 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 de service Web .Net ( SoapHttpClientProtocol ) d'ignorer ces erreurs?

jan.vdbergh
la source

Réponses:

18

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 de cette manière, vous n'avez pas besoin d'ajouter de code personnalisé à votre application et cela simule 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 pour désactiver la vérification par programme.

Simon Johnson
la source
C'était aussi ma première idée. Malheureusement, le certificat a également expiré, il est donc impossible de le faire confiance.
jan.vdbergh
Y a-t-il une raison pour laquelle vous ne pouvez pas utiliser quelqu'un comme CA cert? S'il s'agit d'un certificat de test, vous pouvez simplement continuer avec cela. Je ne sais pas s'il existe un moyen de désactiver ces vérifications!
Simon Johnson
113

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;
}
Alex Bagnolini
la source
1
J'ai ajouté cette méthode statique au global.asax et défini l'événement sur "OnApplicationStart". a fonctionné comme un charme. Merci
Juan Zamora
1
@JuanZamora J'ai fait la même chose que vous. Ça a marché!
Sachin BR
5
C'est tout ce que vous avez à faire, si vous voulez être vulnérable à l' attaque "Man in the Middle" ...
Houtman
2
Idéalement, vous ne devriez le faire que dans un environnement de développement.
Ron DeFreitas
79

Comme la réponse de Jason S:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

Je mets ceci dans ma main et regarde mon app.configet teste si (ConfigurationManager.AppSettings["IgnoreSSLCertificates"] == "True")avant d'appeler cette ligne de code.

Keith Sirmons
la source
24

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

Appelez ce qui suit juste avant d'appeler votre service Web SSL qui provoque 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;
        };
}
Iman
la source
11

J'avais la même erreur en utilisant DownloadString; et a pu le faire fonctionner comme ci-dessous avec des suggestions sur cette page

System.Net.WebClient client = new System.Net.WebClient();            
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
string sHttpResonse = client.DownloadString(sUrl);
Dinesh Rajan
la source
3
ServicePointManager.ServerCertificateValidationCallback +=
            (mender, certificate, chain, sslPolicyErrors) => true;

contournera invaild ssl. Écrivez-le à votre constructeur de service Web.

hasanaydogar
la source
1

Pour les débutants, vous pouvez étendre votre classe de service partielle dans un fichier cs séparé et ajouter le code du code fourni par "imanabidi" pour l'intégrer

Senthil
la source
1

Pour développer davantage l'article de Simon Johnsons - Idéalement, vous voulez une solution qui simule les conditions que vous verrez en production et la modification de votre code ne le fera pas et pourrait être dangereuse si vous oubliez de retirer le code avant de le déployer.

Vous aurez besoin d'une sorte de certificat auto-signé. Si vous utilisez IIS Express, vous en aurez déjà un, il vous suffira de le trouver. Ouvrez Firefox ou le navigateur de votre choix et accédez à votre site Web de développement. Vous devriez pouvoir afficher les informations du certificat à partir de la barre d'URL et selon votre navigateur, vous devriez pouvoir exporter le certificat dans un fichier.

Ensuite, ouvrez MMC.exe et ajoutez le composant logiciel enfichable Certificat. Importez votre fichier de certificat dans le magasin des autorités de certification racines de confiance et c'est tout ce dont vous avez besoin. Il est important de s'assurer qu'il entre dans ce magasin et non dans un autre magasin comme «Personnel». Si vous n'êtes pas familier avec MMC ou les certificats, il existe de nombreux sites Web avec des informations sur la façon de procéder.

Maintenant, votre ordinateur dans son ensemble fera implicitement confiance à tous les certificats qu'il a générés lui-même et vous n'aurez pas besoin d'ajouter de code pour gérer cela spécialement. Lorsque vous passez à la production, il continuera de fonctionner à condition qu'un certificat valide approprié y soit installé. Ne faites pas cela sur un serveur de production - ce serait mauvais et cela ne fonctionnera pas pour d'autres clients que ceux du serveur lui-même.

Nigel Thomas
la source