【问题标题】:Exception: The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel异常:底层连接已关闭:无法为 SSL/TLS 安全通道建立信任关系
【发布时间】:2017-05-22 01:21:16
【问题描述】:

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

在移动设备上传递通知的消息

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

【问题讨论】:

  • 此处的代码 1 using(StreamReader tReader = new StreamReader(dataStreamResponse)) { String sResponseFromServer = tReader.ReadToEnd();字符串 str = sResponseFromServer; }
  • 此代码在本地正常工作,但在服务器上不工作。
  • windows server 2003 r2 os and iis 6 in server install.
  • 在服务器上托管 Web 服务后没有唤醒通知......请帮助我。提前谢谢。

标签: c# web-services iis-6 firebase-notifications windows-server-2003-r2


【解决方案1】:

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

如果证书是自签名的,您可以将其添加到您的 CA 存储中。如果没有,您可以尝试使用浏览器导航端点,并查找端点提供的证书副本,以手动信任它。 (请注意,这样做 if 端点已经受到威胁,您手动信任其证书。)

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

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

【讨论】:

  • 能否详细解释一下以便理解。
  • @bhruguni 点击此链接google.es/url?url=https://blog.talpor.com/2015/07/… 了解有关 TLS 证书的更多信息
  • 任何其他选项....从服务器调用 web 服务时发生错误。但是当我从本地机器执行时它工作正常。
  • 我想您在本地计算机上安装了一个证书,该证书“验证”端点公开的证书,但您的服务器没有。如果您将应用程序作为本地系统服务而不是控制台应用程序或类似服务启动,证书存储也会有所不同。
【解决方案2】:

我不知道为什么要使用上述这行代码

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;

【讨论】:

  • 可能您使用的 c# 版本不支持 lambda 形式的事件处理程序,这就是原因。
【解决方案3】:
  1. 调用网站和 API 站点应具有相同的 SSL 证书 我使用“IIS Express 开发证书”

  2. 将您的证书导出到本地文件 Export Certificate

  3. 将您的证书导入“ConsoleCertificate”中的“Trusted Root Certification Authorities”文件夹

Import it into trust root

【讨论】:

    【解决方案4】:

    这对我有用。

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

    我对它进行了多次测试。绝对解决了这个问题。

    【讨论】:

    • 它不“处理”问题,它隐藏了问题并使您的应用程序易受攻击
    • 幸运的是,我能够摆脱需要此修复的代码。
    猜你喜欢
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    相关资源
    最近更新 更多