APNS SSlStream 身份验证失败,因为远程方已关闭传输流
Posted
技术标签:
【中文标题】APNS SSlStream 身份验证失败,因为远程方已关闭传输流【英文标题】:APNS SSlStream Authentication failed because the remote party has closed the transport stream 【发布时间】:2011-01-07 11:35:46 【问题描述】:我正在尝试使用 asp.net、C# 将通知推送到 iphone。我在这行代码中收到以下错误“身份验证失败,因为远程方已关闭传输流”。
sslStream.AuthenticateAsClient("gateway.sandbox.push.apple.com", clientCertificateCollection, SslProtocols.Ssl3, false);
谁能帮帮我。
提前致谢。
【问题讨论】:
【参考方案1】:您可以尝试将 X509Certificate 更改为 X509Certificate2 并将 X509CertificateCollection 更改为 X509Certificate2Collection。
【讨论】:
【参考方案2】:最近我也收到错误: “对 SSPI 的调用失败。收到的消息出乎意料或格式错误。” 内部例外: “验证失败,因为对方已经关闭了传输流”
帮助我的是改变一点 OpenSslStream 方法 - SSL 协议中的 TSL
旧代码:
apnsStream.AuthenticateAsClient(
this.Host, this.certificates,
System.Security.Authentication.SslProtocols.Ssl3,
false
);
新代码:
apnsStream.AuthenticateAsClient(
this.Host, this.certificates,
System.Security.Authentication.SslProtocols.Ssl3 | System.Security.Authentication.SslProtocols.Tls,
false
);
希望对某人有所帮助...
【讨论】:
遇到了同样的问题。在我的情况下,仅在将两种解决方案 X509Certificate -> X509Certificate2、X509CertificateCollection 应用到 X509Certificate2Collection 并添加 SslProtocols.Tls 标志后才能解决问题。所以,这两个答案都是正确的,都是解决主题所必需的【参考方案3】:我个人使用这个:
sslStream.AuthenticateAsClient("gateway.sandbox.push.apple.com", clientCertificateCollection, SslProtocols.Default, false);
using (TcpClient client = new TcpClient())
client.Connect("gateway.sandbox.push.apple.com", 2195);
using (NetworkStream networkStream = client.GetStream())
try
SslStream sslStream = new SslStream(client.GetStream(), false);
try
sslStream.AuthenticateAsClient("gateway.sandbox.push.apple.com", "gateway.sandbox.push.apple.com", SslProtocols.Default, false);
//building messages
sslStream.Write(msg);
sslStream.close();
【讨论】:
谢谢玛利诺犬。我检查了您的代码行,但它返回相同的错误。您能否使用 C# 发布此 APNS 的代码和步骤。提前致谢。非常感谢您的帮助。【参考方案4】:我认为这里的问题是您在服务器开发中将证书从苹果转换为证书,您可以在 openssl 中使用以下命令来做到这一点:
命令 1: openssl x509 -in "apn_developer_identity.cer" -inform DER -out "apn_developer_identity.pem" -outform PEM 命令 2: openssl pkcs12 -nocerts -in "pushkey1.p12" -out "pushkey1.pem" -passin pass:yourpass -passout pass:yourpass 命令 3: openssl pkcs12 -export -inkey "pushkey1.pem" -in "apn_developer_identity.pem" -out "apn_developer_identity.p12" -passin pass:yourpass -passout pass:yourpass【讨论】:
【参考方案5】:试试下面的代码 sslStream.AuthenticateAsClient("gateway.sandbox.push.apple.com", clientCertificateCollection, SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls, false);
【讨论】:
【参考方案6】:尝试仅使用私钥创建证书。
【讨论】:
以上是关于APNS SSlStream 身份验证失败,因为远程方已关闭传输流的主要内容,如果未能解决你的问题,请参考以下文章
SslStream.AuthenticateAsClient() 使用未缓存的 CRL 非常慢
将 APNs 从证书升级到身份验证令牌是不是会使现有的 deviceToken 失效?