我一直在使用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);
我找到了这些:
iOS push notification does not work when using crontab scheduler
https://devforums.apple.com/message/1054840#1054840
我完全重试了一切。我知道我的密码是正确的。我重新创建了我的证书,pem文件和密钥。什么都行不通。每次我这样做都会出现同样的错误。
我很困惑。
有没有人有任何建议或知道发生了什么?
谢谢!
更新1:
我还尝试设置ck.pem文件的完整路径,该文件也没有修复错误。
答案 0 :(得分: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');
答案 1 :(得分: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',
]
]);
答案 2 :(得分:5)
更新到macOS sierra 10.12.5
请添加
stream_context_set_option($ctx, 'ssl', 'verify_peer', false);
问题在于macOS Sierra中的新PHP版本
答案 3 :(得分:3)
添加
stream_context_set_option($ctx, 'ssl', 'verify_peer', false);
这会破坏服务器验证。 积分@One在上面的评论中的百万应用程序。