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 身份验证失败,因为远程方已关闭传输流的主要内容,如果未能解决你的问题,请参考以下文章

身份验证失败,因为远程方已关闭传输流

转换到 APNS 身份验证密钥的过程是啥?

SslStream.AuthenticateAsClient() 使用未缓存的 CRL 非常慢

将 APNs 从证书升级到身份验证令牌是不是会使现有的 deviceToken 失效?

Windows/Linux dotnet core SslStream 差异

在 APNs 的上下文中,p8 和 p12 是不是分别表示基于令牌和证书的身份验证?