web-dev-qa-db-ja.com

Webクライアント例外:基礎となる接続が閉じられました:SSL / TLSセキュアチャネルの信頼関係を確立できませんでした

C#Web Clientクラスを使用してWebサイトのHTMLをダウンロードするシンプルなアプリがあります。これは、私が使用しているコードの簡単なサンプルです。

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");

この例外が発生したため、Webサイトの証明書に問題があるようです。

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.

リンクをブラウザにコピーして貼り付ける場合、サイトの表示を許可する前にリスクに同意する必要があります。政府のウェブサイトなので、ウイルスなどは心配していません。とにかく、Webクライアントにこの問題を回避し、サイトにアクセスするように指示する必要はありますか?

23
broke

私の知る限り、これは無効または期限切れのSSL証明書を使用しているためです。以下を使用して、これをバイパス(無視)できます。

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

2015年編集

この投稿には多くの賛成票が寄せられていますが、回答を後悔しています。エラーが削除される場合がありますが、問題は修正されません。 SSL証明書を受け入れると、中間者攻撃に対する脆弱性が残るため、一般的に非常に悪い考えです。今後の参考のためにこの回答を残しますが、SSL証明書が有効であることを確認することにより、ルートで問題を修正する必要があることに注意してください。

45
Leon Cullens

これを試してください
あなたがしたいことは、ローカルマシンに証明書をインストールすることです。

コード内でnotであった場合の手順は、以下を実行することです。

  1. Internet Explorerを管理者モード(Chromeではなく)で開きます。
  2. サイトに行く
  3. 続行を選択します
  4. 証明書のtitelbar/URLバーをクリックして、証明書を表示します。
  5. [証明書のインストール]をクリックします。

したがって、これらの他の質問を見て、それらがあなたを助けるかどうか確かめることを試みることができます:

証明書のインストールを試行し、続行するよう求められた場合は、再度URLにアクセスするかどうかを確認します。

****編集**:
サイトの証明書を読んだのは、証明書とサイトのURLが一致していないためです。

簡単な変更は次のとおりです。

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

Wwwを削除するだけです。

15
Johnny

レオン・カレンズの答えをさらに発展させるために、私は次のことを思いつきました。彼が答えで言ったように、これは恒久的な解決策として行うべきではありませんが、このエラーを意図的に取得している場合、これはあなたを助けるかもしれません。これにより、選択の余地がなく、機能するためだけに必要な状況に、もう少しセキュリティが追加されます。

私の現在の状況は、開発目的で、真正の署名証明書ではなく自己署名証明書を使用する必要がありました。もちろん、これは次のエラーにつながります...

「基礎となる接続が閉じられました。SSL/ TLSセキュアチャネルの信頼関係を確立できませんでした。」

ここで、私がやったことをもう少し安全にし、「中間者攻撃」を避けようとしたのです。これをできるだけ短くシンプルにしようとしましたが、わかりやすくするために、全体像を確実にペイントしたかったのです。

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;
        }
    }
}
3
Arvo Bowen

メッセージでこの問題が発生しました:

SSL/TLSセキュアチャネルの信頼関係を確立できませんでした。

.NETクライアントを使用して、Apacheサーバー上のWebサービスに接続していました。これは私にとって問題を修正したものです。

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

this Answer に従って、WebClientインスタンスを使用する前に次の行を追加します。

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