使用PEM文件在PHP中推送通知

San*_* D. 14 php openssl apple-push-notifications ios

我一直在使用Ray Wenderlich的使用PHP脚本推送通知的教程.

参考:http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1

http://www.raywenderlich.com/32963/apple-push-notification-services-in-ios-6-tutorial-part-2

我已经做了大量的研究,但我在第2部分遇到了一个问题,你使用ck.pem文件运行push.php文件.

/Applications/XAMPP/bin/php push.php development

我唯一的区别是我使用XAMPP而不是MAMP.

我已确认已安装所有扩展程序.

我可以通过以下方式测试终端中的证书:

openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem

它要求我输入我的密码并且我这样做.一切都在终端成功运作.

但是,当我运行push.php文件时,我收到以下错误:

PHP警告:stream_socket_client():SSL操作失败,代码为1. OpenSSL错误消息:错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败PHP警告:stream_socket_client():无法启用加密

PHP警告:stream_socket_client():无法连接到第140行的ssl://gateway.sandbox.push.apple.com:2195(未知错误)

php文件中的第140行是:

$this->fp = stream_socket_client('ssl://' . $this->server, $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

我找到了这些:

使用crontab调度程序时,iOS推送通知不起作用

https://devforums.apple.com/message/1054840#1054840

在PHP中推送通知

我确实重复了一切.我知道我的密码是正确的.我重新创建了我的证书,pem文件和密钥.什么都行不通.每次我这样做都会出现同样的错误.

我太困惑了.

有没有人有任何建议或知道发生了什么?

谢谢!

更新1:

我也尝试设置ck.pem文件的完整路径,该文件也没有修复错误.

San*_* D. 58

好的,我终于搞清楚了!经过2天的工作.

所以,对于遇到此问题的其他人:

从以下网址下载entrust_2048_ca.cer证书:https://www.entrust.com/get-support/ssl-certificate-support/root-certificate-downloads/

向下滚动并获得Entrust.net证书颁发机构(2048)

然后,在push.php文件中,在设置密码的上下文后,添加以下行: stream_context_set_option($ctx, 'ssl', 'cafile', 'entrust_2048_ca.cer');

  • 我希望我5小时前找到你的帖子!我一直在拉着我的头发尝试一切.我注意到,如果我从脚本工作的url中删除了'ssl://',但我从未在iPhone上获得推送通知.我碰到了一个人,他说要添加stream_context_set_option($ ctx,'ssl','verify_peer',false); 这会破坏服务器验证.作为一个故障排除的想法,我尝试了它并且presto,推动工作.那时,我知道问题是服务器验证.早些时候,我已经下载了委托证书并将其添加到我的系统钥匙串中,但这没有帮助.我不能感谢你! (5认同)
  • 答案中的URL现在已损坏.目前正确的是https://www.entrust.com/get-support/ssl-certificate-support/root-certificate-downloads/并向下滚动到**Entrust.net证书颁发机构(2048)**. (3认同)
  • 非常感谢!在MacOS Sierra这是解决方案! (2认同)

San*_*der 6

已更新至macOS Sierra 10.12.4


问题出在macOS Sierra的新PHP版本中.他们改变了证书的工作方式.

我建议在接受的答案中做一些小改动,以使事情明确.

你必须设置路径,以entrust_2048_ca.cer创造像流上下文的过程中和其他参数

$streamContext = stream_context_create([
        'ssl' => [
            'verify_peer'      => true,
            'verify_peer_name' => true,
            'cafile'           => '/path/to/bundle/entrust_2048_ca.cer',
        ]
    ]);
Run Code Online (Sandbox Code Playgroud)

完整的解释和链接在这里


Ngu*_*uấn 5

更新到macOS sierra 10.12.5

请加

stream_context_set_option($ctx, 'ssl', 'verify_peer', false);
Run Code Online (Sandbox Code Playgroud)

问题出在macOS Sierra的新PHP版本中