376 votes

Impossible d'établir une relation de confiance pour le canal sécurisé SSL/TLS - SOAP

J'ai un appel de service web simple, généré par une application Windows .NET (C#) 2.0, via le proxy de service web généré par Visual Studio, pour un service web également écrit en C# (2.0). Cela a fonctionné pendant plusieurs années et continue de le faire dans une douzaine d'endroits où il est exécuté.

Une nouvelle installation sur un nouveau site rencontre un problème. Lors de la tentative d'invocation du service web, cela échoue avec le message suivant :

Impossible d'établir une relation de confiance pour le canal sécurisé SSL/TLS

L'URL du service web utilise SSL (https://) -- mais cela fonctionne depuis longtemps (et continue de le faire) depuis de nombreux autres endroits.

Où dois-je regarder? Est-ce un problème de sécurité entre Windows et .NET qui est propre à cette installation? Si c'est le cas, où puis-je configurer les relations de confiance? Je suis perdu!

0 votes

Dans mon cas, cette erreur a été causée par la redirection d'adresse IP.

400voto

Sebastian Castaldi Points 2138

Les extraits suivants corrigeront le cas où il y a un problème avec le certificat SSL sur le serveur que vous appelez. Par exemple, il peut être auto-signé ou le nom d'hôte entre le certificat et le serveur peut ne pas correspondre.

C'est dangereux si vous appelez un serveur en dehors de votre contrôle direct, car vous ne pouvez plus être sûr que vous parlez au serveur auquel vous pensez être connecté. Cependant, si vous traitez avec des serveurs internes et obtenir un certificat "correct" n'est pas pratique, utilisez ce qui suit pour dire au service web d'ignorer les problèmes de certificat et de continuer courageusement.

Les deux premiers utilisent des expressions lambda, le troisième utilise du code régulier. Le premier accepte n'importe quel certificat. Les deux derniers vérifient au moins que le nom d'hôte dans le certificat est celui auquel vous vous attendez.
... j'espère que vous trouverez cela utile

//Faites confiance à tous les certificats
System.Net.ServicePointManager.ServerCertificateValidationCallback =
    ((sender, certificate, chain, sslPolicyErrors) => true);

// faites confiance à l'expéditeur
System.Net.ServicePointManager.ServerCertificateValidationCallback
                = ((sender, cert, chain, errors) => cert.Subject.Contains("NomDeVotreServeur"));

// valider le certificat en appelant une fonction
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValiderCertificatDistant);

// rappel utilisé pour valider le certificat lors d'une conversation SSL
private static bool ValiderCertificatDistant(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors)
{
    bool result = cert.Subject.Contains("NomDeVotreServeur");
    return result;
}

8 votes

Mon expérience avec ServicePointManager. Toute modification à celui-ci affecterait l'ensemble du domaine de l'application. Bien que la réponse explique très clairement comment cela peut être appliqué, j'aime soulever ce point.

0 votes

Configurer le rappel fonctionne en .NET 4.5 pour moi, mais pas en .NET 4.6

1 votes

@Amzath Des suggestions sur la façon de réinitialiser cela après qu'une demande particulière soit complète ? Une personne pourrait avoir besoin de faire une demande à un serveur non certifié, puis remettre les choses en place.

205voto

Remy Points 5039

La solution très simple "catch all" est la suivante :

System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

La solution de sebastian-castaldi est un peu plus détaillée.

26 votes

Je viens de placé cela dans une instruction #If CONFIG = "Debug" afin qu'elle ne soit activée que en mode débogage. Cela fonctionne très bien!

1 votes

Le détail peut être bon, mais il y a quelque chose à dire pour une ligne de code rapide, courte et facile aussi. Ce code est court et fait l'affaire.

0 votes

Est-ce que cela agira uniquement sur l'Action actuelle (par exemple, si ASP MVC est utilisé) ? ou cela sera-t-il défini comme comportement par défaut pour l'application ASP.NET ?

189voto

Marc Gravell Points 482669

Pensées (basées sur la douleur du passé) :

  • avez-vous le DNS et la ligne de mire sur le serveur ?
  • utilisez-vous le nom correct du certificat ?
  • le certificat est-il toujours valide ?
  • un équilibreur de charge mal configuré perturbe-t-il les choses ?
  • la nouvelle machine a-t-elle l'horloge correctement réglée (c'est-à-dire que l'heure UTC est correcte [ignorez l'heure locale, elle est largement sans importance]) - cela compte certainement pour WCF, donc cela pourrait avoir un impact sur le SOAP régulier ?
  • y a-t-il un problème de chaîne de confiance de certificat ? si vous naviguez du serveur vers le service SOAP, pouvez-vous obtenir SSL ?
  • en lien avec ce qui précède - le certificat a-t-il été installé au bon emplacement ? (vous pouvez avoir besoin d'une copie dans Autorités de certification racine de confiance)
  • le proxy au niveau de la machine du serveur est-il correctement configuré ? (différent du proxy de l'utilisateur) ; voir proxycfg pour XP / 2003 (pas sûr pour Vista, etc.)

2 votes

1) Le service web est sur le web. Nous pouvons y accéder via un navigateur. 2) La nouvelle machine n'est pas un serveur - c'est un ordinateur de bureau exécutant mon application, qui recueille les informations de commande et les télécharge via le service SOAP. 3) Oui, nous pouvons y accéder. 4) C'est nouveau pour moi : un proxy au niveau de la machine ?

2 votes

Oui; le code n'utilise pas les paramètres de proxy IE; il utilise un magasin séparé... il est important que cela soit configuré (si vous utilisez un proxy). Sur XP, l'option la plus simple est (si je me souviens bien) "proxycfg -i" pour importer les paramètres IE.

12 votes

Merci Marc. Cela m'a aidé, et le problème était que le serveur avait un certificat signé par une AC tierce en laquelle je n'avais pas encore confiance. La solution était d'ajouter cette AC à la liste des AC racines de confiance.

38voto

cusman Points 391

Je préfère personnellement la solution suivante :

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

... puis avant de faire la demande et d'obtenir l'erreur, faites ce qui suit

System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; };

Je l'ai trouvé après avoir consulté la solution de Luke

6 votes

Voir la réponse de Sebastian Castaldi pour les mises en garde de sécurité concernant cette approche.

0 votes

Quel est le risque de sécurité d'utiliser cela en production ?

0 votes

@Amjad le risque en termes de sécurité est qu'il contourne complètement tous les avantages de l'utilisation de SSL/TLS. Le serveur peut présenter n'importe quel certificat, et ce code ignorera l'erreur.

18voto

diogoap82 Points 159

Si vous utilisez Windows 2003, vous pouvez essayer ceci:

Ouvrez la Console de gestion Microsoft (Démarrer --> Exécuter --> mmc.exe);

Choisissez Fichier --> Ajouter/Supprimer un composant logiciel enfichable;

Dans l'onglet Standalone, choisissez Ajouter;

Choisissez le composant logiciel enfichable Certificats, et cliquez sur Ajouter;

Dans l'assistant, choisissez le Compte d'ordinateur, puis choisissez Ordinateur local. Appuyez sur Terminer pour terminer l'assistant;

Fermez la boîte de dialogue Ajouter/Supprimer un composant logiciel enfichable;

Naviguez vers Certificats (Ordinateur local) et choisissez un magasin à importer:

Si vous avez le certificat AC racine de l'entreprise qui a émis le certificat, choisissez Autorités de certification racine de confiance;

Si vous avez le certificat du serveur lui-même, choisissez Autres personnes

Cliquez avec le bouton droit sur le magasin et choisissez Toutes les tâches --> Importer

Suivez l'assistant et fournissez le fichier de certificat que vous avez;

Après cela, redémarrez simplement IIS et essayez d'appeler à nouveau le service web.

Référence: http://www.outsystems.com/NetworkForums/ViewTopic.aspx?Topic=Web-Services:-Could-not-establish-trust-relationship-for-the-SSL/TLS-...

2 votes

Cela m'a aidé en partie, mais j'avais besoin d'avoir le certificat dans la section Autorités de certification racine de confiance pour que cela fonctionne. Selon blogs.msdn.com/b/jpsanders/archive/2009/09/16/…

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