C# 异常:基础连接已关闭:无法为SSL/TLS安全通道建立信任关系

C# 异常:基础连接已关闭:无法为SSL/TLS安全通道建立信任关系,c#,web-services,iis-6,firebase-notifications,windows-server-2003-r2,C#,Web Services,Iis 6,Firebase Notifications,Windows Server 2003 R2,用于firebase通知代码 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 = mes

用于firebase通知代码

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"}
};
在手机上传递给notifaction的消息

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
    }     
  }   
}  

标题中的异常表示您正在使用TLS加密连接到端点,并且该端点公开的证书不受您的信任。这意味着未使用CA(证书颁发机构)存储中的证书进行签名。就像自签名证书一样

如果证书是自签名的,则可以将其添加到CA存储中。如果没有,您可以尝试使用浏览器导航终结点,并查找终结点显示的证书副本,以手动信任它。(请注意,如果端点已被破坏,则这样做是在手动信任其证书。)

您还可以通过添加始终返回valid!的自定义证书验证处理程序来避免此检查!(对)但是,请注意,这样做会使您面临中间人攻击,因为您将失去检查端点真实性的能力

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

我不知道为什么要使用上面提到的这行代码

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;
我测试了好几次,有没有。肯定解决了这个问题

  • 调用web和API站点应具有相同的SSL证书 我使用“IIS Express开发证书”

  • 将证书导出到本地文件

  • 将您的证书导入“ConsoleCertificate”中的“受信任的根证书颁发机构”文件夹


  • 此处使用(StreamReader tReader=new StreamReader(dataStreamResponse)){String sResponseFromServer=tReader.ReadToEnd();String str=sResponseFromServer;}编码1此代码在本地正常工作,但在服务器上不工作。windows server 2003 r2 os和iis 6在服务器安装中。在服务器上托管web服务后,不工作通知……请帮助我。提前感谢。您可以详细解释以了解。@bRuguni有关TLS的其他信息,请跟随此链接Certificates任何其他选项…从服务器调用webservice时出错。但当我从本地计算机执行时,它工作正常。我假设您在本地计算机中安装了一个证书,可以“验证”端点公开的证书,但您的服务器没有。此外,如果您将应用程序作为本地系统服务而不是控制台应用程序或类似应用程序启动,则证书存储也会有所不同。您使用的c#版本可能不支持lambda形式的EventHandler,这就是为什么。它不会“解决”问题,它将问题隐藏起来,使您的应用程序易受攻击幸运的是,我能够避开需要此修复程序的代码。