web-dev-qa-db-fra.com

Exception du client Web: la connexion sous-jacente a été fermée: impossible d'établir une relation de confiance pour le canal sécurisé SSL/TLS

J'ai une application simple qui utilise la classe Client Web C # pour télécharger un site Web HTML. Voici un exemple simplifié du code que j'utilise:

WebClient wc = new WebClient();
wc.Headers.Add("user-agent",
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
htmlCode = wc.DownloadString("https://www.oig.hhs.gov/exclusions/exclusions_list.asp");

Il semble y avoir un problème avec le certificat de sites Web, car je rencontre cette exception:

The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel." "The remote certificate is invalid according to the validation procedure.

Si vous copiez et collez le lien dans un navigateur, vous devez accepter les risques avant de vous permettre de consulter le site. C'est un site Web du gouvernement, donc je ne m'inquiète pas de virus ou quoi que ce soit. Est-il possible de demander au client Web de contourner ce problème et de continuer vers le site?

20
broke

Autant que je sache, c'est parce qu'ils utilisent un certificat SSL invalide ou expiré. Vous pouvez le ignorer en utilisant:

ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;

Edit 2015 :

Cet article reçoit de nombreux votes positifs, mais je regrette ma réponse. Cela peut supprimer votre erreur, mais cela ne résoudra pas le problème. L'acceptation de tous les certificats SSL vous rendra vulnérable aux attaques entre hommes, c'est donc généralement une très mauvaise idée. Je laisserai cette réponse pour référence future, mais veuillez noter que vous devez essayer de résoudre le problème à la racine, notamment en vous assurant que le certificat SSL est valide.

42
Leon Cullens

Essaye ça:
Ce que vous voudriez faire est d’installer le certificat sur votre ordinateur local.

La procédure s’il s’agissait de not dans le code serait la suivante:

  1. Ouvrez Internet Explorer en mode administrateur (pas Chrome).
  2. Aller sur le site
  3. Sélectionnez procéder
  4. Cliquez sur la barre titelbar/url sur le certificat pour afficher le certificat.
  5. Cliquez sur installer le certificat.

Vous pouvez donc essayer d’examiner ces autres questions et voir si elles vous aident: 

Essayez d’installer le certificat et voyez si vous retournez à l’URL, s’il vous le demande.

****MODIFIER**:
J'ai lu le certificat de site, c'est qu'il y a un décalage entre le certificat et l'URL du site.

Un simple changement serait ceci:

htmlCode = wc.DownloadString("https://oig.hhs.gov/exclusions/exclusions_list.asp");

Il suffit de retirer le www.

14
Johnny

Pour aller encore plus loin sur la réponse de Leon Cullens, j'ai proposé ce qui suit. Comme il l'a dit dans sa réponse, cela ne devrait pas être une solution permanente, mais si vous obtenez cette erreur intentionnellement, cela pourrait vous aider. Cela devrait ajouter un peu plus de sécurité aux situations dans lesquelles vous n'avez pas le choix et dont vous avez juste besoin.

Ma situation actuelle est que, pour des raisons de développement, je devais utiliser un certificat auto-signé et non un véritable certificat signé. Cela conduit bien sûr à l'erreur suivante ...

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

Voici ce que j'ai fait pour essayer de le rendre un peu plus sûr et d'essayer d'éviter les "attaques de type intermédiaire". J'ai essayé de rendre le texte aussi bref et simple que possible, mais je voulais m'assurer de bien brosser le tableau pour le rendre facile à comprendre.

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

namespace TestSecurity
{
    class TestDownload
    {
        private void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
            //Progress in the download
        }

        private void client_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
        {
            //Download has completed
        }

        private bool client_RemoteCertificateValidation(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
            if (sslPolicyErrors == SslPolicyErrors.RemoteCertificateChainErrors)
            {
                //Check to make sure the domain is correct
                X509Certificate2 certificate_details = (X509Certificate2)certificate;
                if (certificate_details.Thumbprint == "91A92CA60555DB51BEDDFE1AE4ECE54C8EBEBA97")
                {
                    #region Fingerprint for certificate
                    string storedFingerprint = "" +
                    "42048c788db687ed84407da10f78182e3487d1fc31c07ee131151f4e19b360ad2a8c452c2e7d614a5691d5479787fe70dabd" +
                    "64617465732e626c75656172726f77646576656c6f706d656e742e636f6d3110300e06035504080c0747656f72676961311f" +
                    "301d060355040a0c16426c7565204172726f7720446576656c6f706d656e74310b3009060355040613025553312f302d0609" +
                    "2a864886f70d0109011620737570706f727440626c75656172726f77646576656c6f706d656e742e636f6d31123010060355" +
                    "04070c09436c6576656c616e64301e170d3136303232393231313733335a170d3137303232383231313733335a3081b03129" +
                    "302706035504030c20757064617465732e626c75656172726f77646576656c6f706d656e742e636f6d3110300e0603550408" +
                    "42048c788db687ed84407da10f78182e3487d1fc31c07ee131151f4e19b360ad2a8c452c2e7d614a5691d5479787fe70dabd" +
                    "0613025553312f302d06092a864886f70d0109011620737570706f727440626c75656172726f77646576656c6f706d656e74" +
                    "2e636f6d3112301006035504070c09436c6576656c616e6430820122300d06092a864886f70d01010105000382010f003082" +
                    "010a0282010100a1cdf5af6f1bba5cc8495d8061895f39858fde814f5581266505bf4cbe0b26506278bc247963bb7c42f0b8" +
                    "b00638871932ed7d0a3c6562be8e5b513f24da2768051acde875b53bf94c8ea2cec397145db206b2524c42a2019a0bfa14e2" +
                    "a7ef0d311235e07b7e0363345fd7f397e365c0865b1b8fa8ad7eebdc1fcdce360db04f2822438621534ae10744155a710641" +
                    "9a69c16745974a37c5b06917036351b92c06540a6c70aa776c143eef6f7b8ec31c0c40a9eab8a399c9065bea688ea7bd1db2" +
                    "30af56d2ca0f8983f9e8dacb5613755fbcd8229d7042668a9130468a7480a2afde8c18bab895472ddf1ed2c49291c04e8cc2" +
                    "ff24db33d231b3a2498c03a5650203010001a34d304b301d0603551d0e0416041476b5c2c82ff138b87c0e2d6c046af4c634" +
                    "55040a0c16426c75652048c1f54dcb82e3487d1fc31c07ee1313fba9204c7b3232ba9204c7b323a021abcbda85bfca9c9931" +
                    "092a864886f70d01010b050003820101001ab0dfd318cc2e93a997445d0950ffcb63544c58fe1ded6e234aa7ccdcb5c890b1" +
                    "61b51ae08c1f54dcb3fbeca9c9932bde91d202b89c0b6f0af1a370017fa9f6a021abcbda85bfecebebc6d6067d4dc1e51ec5" +
                    "02cf95867516a84f01410cf80d7af4f0d3e9a86cf7b0323dba9204c7b3232c58b2289032a12aaa1ec4f64065da8bbde4fe47" +
                    "42048c788db687ed84407da10f78182e3487d1fc31c07ee131151f4e19b360ad2a8c452c2e7d614a5691d5479787fe70dabd" +
                    "de819522bb7ef870595d9738a6acdd39b7fcf6f36948ef2b404c2b6d7ebe577555148ad90013a5c2e812b2b907c808288040" +
                    "0db6702407585328f7e6c84b40451384391783001174d0";
                    #endregion

                    //Use the following to get the server's fingerprint to be saved and compared against
                    StringBuilder hex = new StringBuilder(certificate_details.RawData.Length * 2);
                    foreach (byte b in certificate_details.RawData)
                        hex.AppendFormat("{0:x2}", b);
                    string serverFingerprint = hex.ToString();

                    if (serverFingerprint == storedFingerprint) return true;
                    else return false;
                }
                else return false;
            }
            else if (sslPolicyErrors == SslPolicyErrors.None)
                return true;
            else
                return false;
        }

        public void TestDownload(Uri targetURL, bool useCredentials, string user, string pass)
        {
            WebClient client = new WebClient();
            bool taskCompleted = false;

            //Create the event handlers to monitor progress
            client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
            client.DownloadDataCompleted += new DownloadDataCompletedEventHandler(client_DownloadDataCompleted);
            ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(client_RemoteCertificateValidation);

            //Resolve the Host
            IPHostEntry Host = Dns.GetHostEntry(targetURL.Host);
            IPAddress ip = (Host.AddressList.Length > 0 ? Host.AddressList[0] : null);

            //Show the UI the resolved Host

            //Account for credentials
            if (useCredentials)
            {
                NetworkCredential credentials = new NetworkCredential(
                    user,
                    pass);
                client.Credentials = credentials;
            }
            else client.Credentials = null;

            //Download file
            client.DownloadDataAsync(targetURL, taskCompleted);

            //Go to sleep until the file download has completed
            do { Thread.Sleep(500); } while (client.IsBusy);

            //File download complete

            //Destory the event handlers as they are no longer needed
            ServicePointManager.ServerCertificateValidationCallback -= client_RemoteCertificateValidation;
            client.DownloadProgressChanged -= client_DownloadProgressChanged;
            client.DownloadDataCompleted -= client_DownloadDataCompleted;
        }
    }
}
2
Arvo Bowen

J'ai eu ce problème avec un message: 

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

Je me connectais à un service Web sur un serveur Apache à l'aide d'un client .NET. C'est ce qui a corrigé le problème pour moi. 

(proxy).UserAgent = "Apache-HttpClient/4.1.1 (Java 1.5)";
0
Patrick

Selon cette réponse , ajoutez cette ligne avant d'utiliser l'instance WebClient:

ServicePointManager.ServerCertificateValidationCallback = new        
RemoteCertificateValidationCallback(delegate { return true; });
0
AmirHossein Rezaei