APNS + PHP“stream_socket_client():无法启用加密”

时间:2015-03-11 19:03:40

标签: php ios apple-push-notifications push apns-php

我在使用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

进行测试

以下是我的尝试:

  • 我试图用它重新发行PEM和所有证书。
  • 我使用了请求协议sslv3://tls://
  • 我玩了密码(推文没有使用密码短语)
  • 我尝试在stackoverflow中搜索解决方案但没有任何效果。
  • 已检查的pem文件权限644
  • 已检查pem父目录权限755

似乎我在Google和SO上找到的所有解决方案都是完全没有问题的人。

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

8 个答案:

答案 0 :(得分:14)

沙盒推送服务的速率有限。我在测试时自己经历过这种情况,但从未使用生产API遇到任何此类限制。

你可能也会受到其他保护。

您是否正在打开连接,发送消息,关闭连接然后循环并重新执行此操作?

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

  

管理连接的最佳做法

     

您可以与同一网关建立多个连接   多个网关实例。如果你需要发送大量的   远程通知,通过几个连接传播它们   不同的网关。与使用a相比,这提高了性能   单一连接:它可以让您更快地发送远程通知,   它让APN更快地提供它们。

     

在多个通知中保持与APN的连接;   不要反复打开和关闭连接。 APN迅速对待   连接和断开作为拒绝服务攻击。你应该   保持连接打开,除非你知道它会闲置一个   延长的时间段 - 例如,如果您只发送通知   您的用户每天可以使用一次新连接。

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

答案 1 :(得分:5)

我的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文件。

答案 2 :(得分:1)

无需重新创建您的pem文件

使用错误的PassPhrase

时会发生错误

问候 埃米利亚诺

答案 3 :(得分:0)

我有这个问题。在给予“每个人”的写入许可后消失了。对于.pem文件。

答案 4 :(得分:0)

我有这个问题,因为我在提供local_cert的文件路径时愚蠢地忘了包含文件扩展名(.pem)。

答案 5 :(得分:0)

几次检查

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

我做了我在Stackoverflow中发现的所有内容-更改了证书和其他权限。

我最终做了什么?

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

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

该服务生效后。