Исключение: базовое соединение было закрыто: не удалось установить доверительные отношения для безопасного канала 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;
У вызывающего веб-сайта и API-сайта должен быть тот же сертификат SSL, который я использую "Сертификат разработки IIS Express".
Экспорт сертификата в локальный файл Экспорт сертификата
Импортируйте свой сертификат в папку "Доверенные корневые центры сертификации" в "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;
Я проверял это несколько раз с и без. Определенно позаботился о проблеме.