【问题标题】:APNS + PHP "stream_socket_client(): Failed to enable crypto"APNS + PHP“stream_socket_client():无法启用加密”
【发布时间】:2015-05-13 17:58:33
【问题描述】:

我在将 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 条消息,直到我再次开始收到该消息。

【问题讨论】:

  • 您找到解决方案了吗,Samer?我的情况和你很像!好吧,事实上我有时可以发送 apns,但最近我意识到我的脚本花了几个月的时间试图一次发送一个 apns,即使我的证书已经过期......我在问自己 Apple 是否只是阻止了我的 IP,也许现在我停止尝试连接,他们会在一定时间后解锁我的 IP...
  • 没关系,看看我关于更换苹果服务器的回答!!现在我使用 ssl://api.push.apple.com:443 而不是 ssl://gateway.push.apple.com:2195

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


【解决方案1】:

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

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

您是在打开连接、发送消息、关闭连接然后循环并重新开始吗?

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

管理连接的最佳实践

您可以建立多个连接到同一个网关或 多个网关实例。如果您需要发送大量 远程通知,通过连接分散到多个 不同的网关。与使用 单连接:它可以让您更快地发送远程通知, 并且它可以让 APN 更快地交付它们。

在多个通知中保持与 APN 的连接处于打开状态; 不要反复打开和关闭连接。 APNs 治疗快速 连接和断开连接是一种拒绝服务攻击。 您应该 保持连接打开,除非您知道它将空闲一段时间 延长时间——例如,如果您只向 您的用户每天一次,可以每天使用一个新连接。

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

【讨论】:

  • 这是有道理的,我通常保持连接打开直到发送到所有设备,所以这部分应该很好。让我们希望生产是好的。谢谢!
  • 大声笑对不起不知道我必须按下赏金按钮来奖励它。我以为是自动的。
  • 正如@greg_diesel 回答中所说,“Apple 希望您使用相同的连接发送多个推送通知,而不是每次都发送一个新的”。许多库使用 stream_socket_client 发送带有选项 STREAM_CLIENT_CONNECT 的消息。尝试将其更改为 STREAM_CLIENT_PERSISTENT
【解决方案2】:

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

【讨论】:

  • 是的!我重新创建了我的证书并且它有效。谢谢!只是提醒如何生成证书: openssl pkcs12 -in cert.p12 -out cert.pem -nodes -clcerts
【解决方案3】:

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

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

问候 埃米利亚诺

【讨论】:

    【解决方案4】:

    我遇到了这个问题。在为 .pem 文件授予“每个人”的写入权限后消失。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        很少检查

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

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

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

            我最终做了什么?

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

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

            该服务生效后。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2023-04-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-12-14
              相关资源
              最近更新 更多