ASP.NET и основное соединение были закрыты: не удалось установить доверительные отношения для безопасного канала SSL / TLS - PullRequest
8 голосов
/ 07 января 2010

Я делаю httpwebrequest с использованием общедоступного файла сертификата Root Authority X509. У меня есть только открытый ключ, а не закрытый ключ. Все отлично работает из консольного приложения, но не работает из приложения asp.net. Я получаю сообщение об ошибке: «Базовое соединение было закрыто: не удалось установить доверительные отношения для безопасного канала SSL / TLS».

Опция отключения проверки не является опцией.

Вот код

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://xxxxxxx/gateway.aspx");
string post = "abcdef";
req.ContentType = "application/x-www-form-urlencoded";
req.Method = "POST";
req.ContentLength = post.Length;

var cert = System.Security.Cryptography.X509Certificates.X509Certificate.CreateFromCertFile(@"c:\temp\root.cer");

req.ClientCertificates.Add(cert);
StreamWriter stOut = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII);
stOut.Write(post.ToString());
stOut.Close();

HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

Вот системные журналы из сокетов System.Net и System.Net.

Информация о System.Net: 0: [5928] SecureChannel # 8106798 - Невозможно создать цепочку сертификатов для доверенного корневого органа.

Информация System.Net: 0: [5928] SecureChannel # 8106798 - Удаленный сертификат был подтвержден пользователем как недействительный.

System.Net.Sockets Verbose: 0: [5928] Сокет # 7486778 :: Dispose ()

Ошибка System.Net: 0: [5928] Исключение в HttpWebRequest # 51319244 :: - Базовое соединение было закрыто: не удалось установить доверительные отношения для безопасного канала SSL / TLS.

Ошибка System.Net: 0: [5928] Исключение в HttpWebRequest # 51319244 :: EndGetRequestStream - Основное соединение было закрыто: не удалось установить доверительные отношения для безопасного канала SSL / TLS.

Дополнительная информация

Если я использую этот код (из CodeGuru)

  public static bool ValidateServerCertificate(object sender,
     X509Certificate certificate, X509Chain chain,
     SslPolicyErrors sslPolicyErrors)
  {
     if (sslPolicyErrors ==
        SslPolicyErrors.RemoteCertificateChainErrors) {
        return false;
     } else if (sslPolicyErrors ==
        SslPolicyErrors.RemoteCertificateNameMismatch) {
        System.Security.Policy.Zone z =
           System.Security.Policy.Zone.CreateFromUrl
           (((HttpWebRequest)sender).RequestUri.ToString());
        if (z.SecurityZone ==
           System.Security.SecurityZone.Intranet ||
           z.SecurityZone ==
           System.Security.SecurityZone.MyComputer) {
           return true;
        }
        return false;
     }
     return true;
  }

Я в итоге получаю ошибку:

Ошибка цепочки удаленного сертификата

Ответы [ 2 ]

10 голосов
/ 16 марта 2012

Эта проблема может быть исправлена ​​добавлением в Application_Start:

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

Это в основном допускает несоответствие между сервером и его сертификатом.

Источник:

http://www.ben -morris.com / жерех-сетчатая веб-сервисы и-SSL-сертификаты, создание-а-ТРАСТ-отношений

Примечание: этот обходной путь не рекомендуется для производства

1 голос
/ 07 января 2010

Похоже, проблема может заключаться в том, что размещено по этой ссылке . Рабочий процесс ASPNET требует, чтобы имя сертификата совпадало с именем сервера. Существуют обходные пути, которые можно реализовать в тестовых средах.

Для генерации сертификата вы можете использовать бесплатную программу SelfSSL.exe с такими командами, как:

SelfSSL.exe /T /N:CN=localhost /V:999 /Q (где "localhost" - это имя сертификата)

И

winHTTPCertCfg.exe -g -c local_machine\my -s localhost -a Administrators (для предоставления администраторам доступа к сертификату)

...