APNS + PHP "stream_socket_client(): Failed to enable crypto"

APNS + PHP "stream_socket_client(): Failed to enable crypto"

我在将 APNS 与 PHP 一起使用时遇到问题并收到以下消息:

stream_socket_client(): Failed to enable crypto

这个问题只是有时会发生,而其他时候它实际上会发送推送。

因为我有一个循环 10 次迭代的测试脚本,我有时会得到这个:

stream_socket_client(): SSL: Connection reset by peer

我正在使用沙盒服务器进行测试 tls://gateway.sandbox.push.apple.com:2195

这是我尝试过的:

似乎我在 Google 和 SO 上找到的所有解决方案都是人们在推动时遇到的问题。

我觉得服务可能是限速的?因为我们等待了一段时间(大约 15 分钟)然后再次尝试,并且能够成功推送大约 100 条消息,直到我再次开始收到该消息。

沙盒推送服务有速率限制。我自己在测试时也遇到过这种情况,但在使用生产 API.

时从未遇到过任何此类限制

您可能还会遇到其他保护措施。

您是否打开连接、发送消息、关闭连接然后循环并重新做一遍?

这将使您的通知被删除。 Apple 希望您使用同一个连接发送多个推送通知,而不是每次都发送一个新的。

Best Practices for Managing Connections

You may establish multiple connections to the same gateway or to multiple gateway instances. If you need to send a large number of remote notifications, spread them out over connections to several different gateways. This improves performance compared to using a single connection: it lets you send the remote notifications faster, and it lets APNs deliver them faster.

Keep your connections with APNs open across multiple notifications; don’t repeatedly open and close connections. APNs treats rapid connection and disconnection as a denial-of-service attack. You should leave a connection open unless you know it will be idle for an extended period of time—for example, if you only send notifications to your users once a day it is ok to use a new connection each day.

来自 Apple 文档@https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/CommunicatingWIthAPS.html

我的 PHP 代码生成了以下错误:

PHP Warning:  stream_socket_client(): Failed to enable crypto in /private/tmp/t.php on line 12
PHP Warning:  stream_socket_client(): unable to connect to ssl://gateway.sandbox.push.apple.com:2195 (Unknown error) in /private/tmp/t.php on line 12
PHP Warning:  fclose() expects parameter 1 to be resource, boolean given in /private/tmp/t.php on line 24

问题是,该死的证书,前天就过期了! :-) 你能相信吗?

所以,我需要重新创建我的 PEM 文件。

没有必要重新创建您的 pem 文件

当您使用不正确的密码短语时会发生该错误

问候 埃米利亚诺

我遇到了这个问题。为 .pem 文件授予 'everyone' 写权限后消失。

我遇到这个问题是因为我在为 local_cert.

提供文件路径时愚蠢地忘记了包含文件扩展名 (.pem)

很少检查

  1. 设备令牌应该是 - 没有 spaces 并且没有 <>
  2. 确保证书的路径和过期日期正确。
  3. 确保您使用的密码是您用来制作证书的密码

就我而言,问题出在我的 mac (OSX Sierra) 上。我将 php 和证书上传到我的服务器,运行 它,通知已发送。

我尝试了教程中 Marin Todorov iOs 6 书中的示例。 在我发送自动更新的推送通知之前,我有很多令人头疼的握手错误原因 - stream_socket_client(): Failed to enable crypto.

我做了我在 Whosebug 中找到的所有内容 - 更改了证书和其他方面的权限。

我最后做了什么?

我创建了自签名 SSL 证书并设置了 Apache 来提供 SSL。
另外,我在主机名中将 SSL 协议从 ssl 更改为 tls:

tls://gateway.push.apple.com:2195

服务正常后。