Исключение: базовое соединение было закрыто: не удалось установить доверительные отношения для безопасного канала SSL/TLS

для кода уведомления пожарной базы

WebRequest tRequest = WebRequest.Create("https://fcm.googleapis.com/fcm/send"); 
tRequest.Method = "post";
tRequest.ContentType = "application/json";
var data = new{collapse_key = "unassigned", to = deviceToken,data = new
  {body = message,title = title,sound = "default"}
};

сообщение для передачи на уведомление на мобильный

var serializer = new JavaScriptSerializer();
var json = serializer.Serialize(data);
Byte[] byteArray = Encoding.UTF8.GetBytes(json);
tRequest.Headers.Add(string.Format("Authorization: key={0}", applicationId));
tRequest.Headers.Add(string.Format("Sender: id={0}", senderId));
tRequest.ContentLength = byteArray.Length;

ошибка происходит здесь ниже кода

using (Stream dataStream = tRequest.GetRequestStream())
{ 
  dataStream.Write(byteArray, 0, byteArray.Length);
 using (WebResponse tResponse = tRequest.GetResponse())
  { 
    using (Stream dataStreamResponse = tResponse.GetResponseStream())
    { 

   //code 1
    }     
  }   
}  

3 ответа

Решение

Исключение в заголовке говорит о том, что вы подключаетесь к конечной точке с шифрованием TLS, и сертификат, предоставляемый этой конечной точкой, не является доверенным для вас, что означает, что он не подписан сертификатом, который имеется в вашем хранилище CA. Как и самозаверяющий сертификат.

Если сертификат самозаверяющий, вы можете добавить его в свой CA Store. Если нет, вы можете попытаться перейти к конечной точке с помощью браузера, найти копию сертификата, который подписан, а затем добавить его в свой Магазин.

Вы также можете избежать этой проверки, добавив пользовательский обработчик проверки сертификата, который всегда возвращает действительный! (правда)

ServicePointManager
    .ServerCertificateValidationCallback += 
    (sender, cert, chain, sslPolicyErrors) => true;
  1. У вызывающего веб-сайта и API-сайта должен быть тот же сертификат SSL, который я использую "Сертификат разработки IIS Express".

  2. Экспорт сертификата в локальный файл Экспорт сертификата

  3. Импортируйте свой сертификат в папку "Доверенные корневые центры сертификации" в "ConsoleCertificate".

Импортируйте его в доверенный корень

Я не знаю, почему с помощью этой строки кода, указанной выше

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

я не мог заставить это работать

Так что, используя этот способ, он работал правильно:

internal static bool ValidateServerCertificate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    return true;
}
ServicePointManager.ServerCertificateValidationCallback  = ValidateServerCertificate;

Это сработало для меня.

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

Я проверял это несколько раз с и без. Определенно позаботился о проблеме.

Другие вопросы по тегам