Web客户端例外:基础连接已关闭:无法为SSL / TLS安全通道建立信任关系

我有一个简单的应用程序,它使用C#Web Client类下载网站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"); 

网站证书似乎有问题,因为我遇到了这个例外:

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.

如果您将链接复制并粘贴到浏览器中,则需要您在允许您查看网站之前同意风险。 它是一个政府网站,所以我不担心任何病毒或任何东西。 有没有告诉网络客户端绕过这个问题,并继续访问该网站?

据我所知,这是因为他们使用无效或过期的SSL证书。 您可以使用以下方法绕过(忽略)它:

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

编辑2015

这篇文章得到了很多赞成,但我对我的回答感到遗憾。 它可能会删除您的错误,但它无法解决问题。 接受任何SSL证书会让你在中间攻击中容易受到攻击,所以这通常是一个非常糟糕的主意。 我将留下此答案以供将来参考,但请注意,您应该尝试在根目录中解决问题,即确保SSL证书有效。

试试这个
您希望将证书安装到本地计算机上。

如果不在代码中的过程将执行以下操作:

  1. 以管理员模式(不是Chrome)打开Internet Explorer。
  2. 转到该网站
  3. 选择继续
  4. 单击证书上的titelbar / url栏以查看证书。
  5. 单击安装证书。

因此,您可以尝试查看这些其他问题,看看它们是否对您有所帮助:

  • 如何使用c#以编程方式将证书安装到本地计算机存储中?
  • 在C#中将证书安装到Windows本地用户证书存储区

尝试安装证书,如果要求继续,请查看是否再次访问该URL。

****编辑**:
我读了网站证书,这是因为证书与网站的url不匹配。

一个简单的改变是:

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

只需删除www。

为了进一步建立Leon Cullens的答案,我提出了以下建议。 就像他在回答中说的那样,这不应该是你作为永久性解决方案所做的事情,但如果你故意得到这个错误,这可能会帮助你。 这应该为您没有选择并且只需要它工作的情况增加一点安全性。

我目前的情况是在开发过程中我需要使用自签名证书而不是真正的签名证书。 这当然会导致以下错误……

“底层连接已关闭:无法为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; } } } 

我有这个问题的消息:

无法为SSL / TLS安全通道建立信任关系。

我使用.NET客户端连接到Apache服务器上的Web服务。 这就是为我纠正问题的原因。

 (proxy).UserAgent = "Apache-HttpClient/4.1.1 (java 1.5)";