Impossible d'établir une relation de confiance pour SSL / TLS secure channel-SOAP

J'ai un simple appel de service web, 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 à la douzaine d'endroits où il fonctionne.

Une nouvelle installation sur un nouveau site rencontre un problème. Lorsque vous tentez d'appeler le service web, il échoue avec le message disant:

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

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

Où est-ce que je regarde? Cela pourrait-il être un problème de sécurité entre Windows et. NET qui est unique à cette installation? Si oui, où puis-je mettre en place des relations de confiance? Je suis perdu!

291
demandé sur Amirhossein Mehrvarzi 2009-04-01 02:07:28

15 réponses

Pensées (basées sur la douleur dans le passé):

  • Avez-vous DNS et ligne de vue sur le serveur?
  • Utilisez - vous le nom correct du certificat?
  • le certificat est-il toujours valide?
  • un équilibreur de charge mal configuré gâche-t-il les choses?
  • la nouvelle machine server a-t-elle l'horloge correctement réglée (c'est-à-dire que l'heure UTC est correcte [ignorer l'heure locale, c'est en grande partie irrelevable]) - cela compte certainement pour WCF, donc peut avoir un impact le SAVON ordinaire?
  • y a-t-il un problème de chaîne de confiance de certificat? si vous naviguez du serveur au service soap, pouvez-vous obtenir SSL?
  • lié à ce qui précède-le certificat a-t-il été installé au bon emplacement? (vous pouvez avoir besoin d'une copie dans les autorités de Certification racine de confiance)
  • le proxy au niveau de la machine du serveur est-il correctement défini? (ce qui est différent du proxy de l'utilisateur); voir proxycfg pour XP / 2003 (pas sûr de Vista etc)
150
répondu Marc Gravell 2018-01-18 11:42:36

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.

Ceci est dangereux Si vous appelez un serveur en dehors de votre contrôle direct, car vous ne pouvez plus être aussi sûr que vous parlez au serveur auquel vous pensez être connecté. Cependant, si vous avez affaire à 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 persévérer courageusement.

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

//Trust all certificates
System.Net.ServicePointManager.ServerCertificateValidationCallback =
    ((sender, certificate, chain, sslPolicyErrors) => true);

// trust sender
System.Net.ServicePointManager.ServerCertificateValidationCallback
                = ((sender, cert, chain, errors) => cert.Subject.Contains("YourServerName"));

// validate cert by calling a function
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate);

// callback used to validate the certificate in an SSL conversation
private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors)
{
    bool result = false;
    if (cert.Subject.ToUpper().Contains("YourServerName"))
    {
        result = true;
    }

    return result;
}
334
répondu Sebastian Castaldi 2015-11-03 14:17:14

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

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

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

147
répondu Remy 2013-03-18 18:00:00

Personnellement, j'aime le plus la solution suivante:

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

... ensuite, avant de demander l'erreur, procédez comme suit

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

Trouvé ceci après avoir consulté la Solution de Luke

30
répondu cusman 2013-02-26 22:59:24

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 Autonome, choisissez Ajouter;

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

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

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

Accédez aux certificats (locaux Ordinateur) et choisissez un magasin pour importer:

Si vous avez le certificat CA racine pour la société qui a émis le certificat, choisissez la racine approuvée Les Autorités De Certification;

Si vous avez le certificat pour serveur lui-même, choisissez D'autres personnes

Cliquez avec le bouton droit sur le magasin et choisissez Tout Tâches -- > Importer

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

Après cela, redémarrez simplement IIS et essayez 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-...

17
répondu Diogo 2011-03-25 00:10:56

Si vous ne voulez pas faire aveuglément confiance à tout le monde et faire une exception de confiance uniquement pour certains hôtes, la solution suivante est plus appropriée.

public static class Ssl
{
    private static readonly string[] TrustedHosts = new[] {
      "host1.domain.com", 
      "host2.domain.com"
    };

    public static void EnableTrustedHosts()
    {
      ServicePointManager.ServerCertificateValidationCallback = 
      (sender, certificate, chain, errors) =>
      {
        if (errors == SslPolicyErrors.None)
        {
          return true;
        }

        var request = sender as HttpWebRequest;
        if (request != null)
        {
          return TrustedHosts.Contains(request.RequestUri.Host);
        }

        return false;
      };
    }
}

Ensuite, appelez simplement Ssl.EnableTrustedHosts lorsque votre application démarre.

14
répondu Gregor Slavec 2014-10-08 07:58:09

L'outil de diagnostic SSL de Microsoft {[2] } peut aider à identifier le problème.

Mise à jour le lien a été corrigé maintenant.

7
répondu sipwiz 2013-09-30 04:07:23

Luke a écrit un très bon article à ce sujet .. assez simple et directe .. donner à ceci un essai

La Solution de Luke

Raison (citation de son article (moins malédiction)) ".. Le problème avec le code ci-dessus est qu'il ne fonctionne pas si votre certificat n'est pas valide. Pourquoi publierais - Je sur une page web avec un certificat SSL invalide? Parce que je suis pas cher et je ne me sentais pas comme payer Verisign ou l'un des autres **-*s pour un cert à ma boîte de test donc je me suis auto signé il. Quand j'ai envoyé la demande, une belle exception m'a été lancée:

Système. Net. WebException la connexion sous-jacente a été fermée. Impossible d'établir une relation de confiance avec le serveur distant.

Je ne sais pas pour vous, mais pour moi cette exception ressemblait à quelque chose qui serait causé par une erreur stupide dans mon code qui causait l'échec du POST. J'ai donc continué à chercher, à peaufiner et à faire toutes sortes de choses étranges. Seulement après avoir googlé la chose * * * n I découvert que le comportement par défaut après avoir rencontré un certificat SSL invalide est de lancer cette exception même. .."

6
répondu Hans 2012-10-25 19:36:27

Je viens de rencontrer ce problème. Ma résolution était de mettre à jour l'heure du système en synchronisant manuellement les serveurs de temps. Pour ce faire, vous pouvez:

  • cliquez avec le bouton droit sur l'horloge dans la barre des tâches
  • Sélectionnez Adjust Date/Time
  • Sélectionnez l'onglet Internet Time
  • Cliquez sur Change Settings
  • Sélectionnez Update Now

Dans mon cas, cela se synchronisait incorrectement, donc j'ai dû cliquer dessus plusieurs fois avant qu'il ne soit mis à jour correctement. Si elle continue à mettre à jour de manière incorrecte vous pouvez même essayer d'utiliser un autre moment serveur de la liste déroulante.

3
répondu Chris - Haddox Technologies 2013-02-22 16:09:16

J'ai eu un problème similaire dans l'application .NET dans Internet Explorer.

J'ai résolu le problème en ajoutant le certificat (Verisign Class 3 certificate dans mon cas) aux certificats d'éditeurs de confiance.

Allez dans Options Internet - > contenu - > Éditeurs et importez-le

Vous pouvez obtenir le certificat si vous l'exportez depuis:

Options Internet - > Contenu - > Certificats - > Autorités De Certification Intermédiaires - > VeriSign Classe 3 Autorité De Certification Primaire Publique-G5

2
répondu debiasej 2015-05-25 14:07:40

Essayez ceci:

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;

Notez que vous devez travailler au moins avec 4.5. NET framework

2
répondu Manuel Roldan 2018-05-15 12:23:57

J'ai eu cette erreur en cours d'exécution contre un serveur Web avec une url comme:

a.b.domain.com

Mais il n'y avait pas de certificat pour cela, donc j'ai eu un DNS appelé

a_b.domain.com

Juste mettre un indice à cette solution ici puisque cela est venu en haut dans google.

1
répondu Thomas Koelle 2014-01-22 13:28:26

Pour ceux qui ont ce problème via un côté client VS une fois ajouté avec succès une référence de service et essayer d'exécuter le premier appel a obtenu cette exception: "La connexion sous-jacente a été fermée: impossible d'établir une relation de confiance pour le canal sécurisé SSL/TLS" Si vous utilisez (comme mon cas) une URL de point de terminaison avec l'adresse IP et que vous avez cette exception, vous devriez probablement ajouter à nouveau la référence du service en procédant comme suit:

  • Ouvrez l'URL du point de terminaison Internet Explorer.
  • Cliquez sur l'erreur de certificat (icône rouge dans la barre d'adresse)
  • Cliquez sur Afficher les certificats.
  • Saisissez le " nom "délivré à: et remplacez l'adresse IP ou n'importe quel nom que nous utilisions et obtenez l'erreur pour ce "nom".

Réessayez:). Merci

1
répondu Ernest 2017-06-12 20:28:05

Dans mon cas, j'essayais de tester SSL dans mon environnement Visual Studio en utilisant IIS 7.

C'est Ce que j'ai fait pour le faire fonctionner:

  • Sous mon site dans les ' liaisons...'section à droite dans IIS, j'ai dû ajouter la liaison 'https' au port 443 et sélectionner "certificat de développement IIS Express".

  • Sous mon site dans le ' Paramètres avancés...'section sur la droite j'ai dû changer les 'Protocoles activés' de "http" à "http".

  • Sous l'icône "Paramètres SSL", j'ai sélectionné "accepter" pour les certificats clients.

  • Ensuite, j'ai dû recycler le pool d'applications.

  • J'ai également dû importer le certificat d'hôte local dans mon magasin personnel en utilisant mmc.EXE.

Mon fichier web.config était déjà configuré correctement, donc après avoir réglé tout ce qui précède, j'ai pu continuer mes tests.

0
répondu Popo 2014-02-17 17:55:24

Si cela ne fonctionne pas mal sertificate, lorsque ServerCertificateValidationCallback renvoie true; Mon code ServerCertificateValidationCallback:

ServicePointManager.ServerCertificateValidationCallback += delegate
{
    LogWriter.LogInfo("Проверка сертификата отключена, на уровне ServerCertificateValidationCallback");
    return true;
};

Mon code que l'exécution empêchée ServerCertificateValidationCallback:

     if (!(ServicePointManager.CertificatePolicy is CertificateValidation))
    {
        CertificateValidation certValidate = new CertificateValidation();
        certValidate.ValidatingError += new CertificateValidation.ValidateCertificateEventHandler(this.OnValidateCertificateError);
        ServicePointManager.CertificatePolicy = certValidate;
    }

OnValidateCertificateError fonction:

private void OnValidateCertificateError(object sender, CertificateValidationEventArgs e)
{
    string msg = string.Format(Strings.OnValidateCertificateError, e.Request.RequestUri, e.Certificate.GetName(), e.Problem, new Win32Exception(e.Problem).Message);
    LogWriter.LogError(msg);
    //Message.ShowError(msg);
}

J'ai désactivé le code CertificateValidation et ServerCertificateValidationCallback fonctionnant très bien

-4
répondu Roberto Gata 2017-01-10 11:17:07