Исключение веб-клиента: базовое соединение было закрыто: не удалось установить доверительные отношения для безопасного канала SSL/TLS
У меня есть простое приложение, которое использует класс С# 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.
Если вы скопируете и вставьте ссылку в браузер, вам необходимо согласиться с рисками, прежде чем разрешить просматривать сайт. Его правительственный веб-сайт, поэтому я не беспокоюсь о каких-либо вирусах или что-то еще. В любом случае, чтобы сообщить веб-клиенту обойти эту проблему и продолжить работу с сайтом?
Ответы
Ответ 1
Насколько я знаю, это связано с тем, что они используют недействительный или истекший сертификат SSL. Вы можете обойти (игнорировать) его, используя:
ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;
Изменить 2015:
Этот пост получает много авансов, но я сожалею о своем ответе. Он может удалить вашу ошибку, но это не решит проблему. Принятие любых сертификатов SSL оставит вас уязвимыми для человека в средних атаках, так что это вообще очень плохая идея. Я оставлю этот ответ для будущей справки, но, пожалуйста, обратите внимание, что вы должны попытаться исправить проблему в корне, а именно, удостоверившись, что сертификат SSL действителен.
Ответ 2
Попробуйте следующее:
Что бы вы хотели сделать, так это установить сертификат на локальную машину.
Процедура, если она была не в коде, заключалась бы в следующем:
- Откройте Internet Explorer в режиме администратора (а не в Chrome).
- Перейти на сайт
- Выберите действие
- Нажмите на панель титров/ссылок в сертификате, чтобы просмотреть сертификат.
- Нажмите "Установить сертификат".
Итак, вы можете попытаться взглянуть на эти другие вопросы и посмотреть, помогут ли они вам:
Попробуйте установить сертификат и посмотрите, если вы снова заходите на URL-адрес, если он просит продолжить.
**** ** EDIT:
Я прочитал сертификат сайта, потому что существует несоответствие между сертификатом и URL-адресом сайта.
Простым изменением будет следующее:
htmlCode = wc.DownloadString("https://oig.hhs.gov/exclusions/exclusions_list.asp");
Просто удалите www.
Ответ 3
Чтобы еще больше укрепить ответ Леона Калленса, я придумал следующее. Как он сказал в своем ответе, это не должно быть чем-то, что вы делаете как постоянное решение, но в случае, когда вы произвольно получаете эту ошибку, это может помочь вам. Это должно добавить немного больше безопасности в ситуации, когда у вас нет выбора, и просто нужно, чтобы он работал.
Моя текущая ситуация во время разработки. Мне нужно было использовать самоподписанный сертификат, а не подлинный подписанный сертификат. Это, конечно, приводит к следующей ошибке...
"Основное соединение было закрыто: не удалось установить доверие отношения для безопасного канала 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 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;
}
}
}
Ответ 4
У меня была эта проблема с сообщением:
Не удалось установить доверительные отношения для безопасного канала SSL/TLS.
Я подключался к веб-службе на сервере Apache с помощью клиента.NET. Это то, что исправило проблему для меня.
(proxy).UserAgent = "Apache-HttpClient/4.1.1 (java 1.5)";
Ответ 5
Согласно этому ответу, добавьте эту строку перед использованием экземпляра WebClient:
ServicePointManager.ServerCertificateValidationCallback = new
RemoteCertificateValidationCallback(delegate { return true; });