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

使用PEM文件在PHP中推送通知,php,ios,openssl,apple-push-notifications,Php,Ios,Openssl,Apple Push Notifications,我一直在学习Ray Wenderlich关于使用PHP脚本推送通知的教程 参考: 我已经做了大量的研究,但在第2部分中遇到了一个问题,您使用ck.pem文件运行push.php文件 /Applications/XAMPP/bin/php push.php开发 我唯一的区别是我使用的是XAMPP而不是MAMP 我已确认所有扩展都已安装 我可以通过以下操作在终端中测试我的证书: openssl s_client-connect gateway.sandbox.push.apple.com:2195

我一直在学习Ray Wenderlich关于使用PHP脚本推送通知的教程

参考:

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

/Applications/XAMPP/bin/php push.php开发

我唯一的区别是我使用的是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\u获取\u服务器\u证书:证书验证失败 PHP警告:stream_socket_client():无法在中启用加密

PHP警告:流\u套接字\u客户端():无法连接到ssl://gateway.sandbox.push.apple.com:2195 第140行中的(未知错误)

php文件中的第140行是:

$this->fp=stream\u socket\u client('ssl://'。$this->server,$err,$errstr,60,stream\u client\u CONNECT | stream\u client\u PERSISTENT,$ctx)

我发现:

我真的尝试了一切。我知道我的密码是正确的。我已经重新创建了证书、pem文件和密钥。什么都不管用。每次我这样做都会犯同样的错误

我一点也不糊涂

有人有什么建议或知道发生了什么吗

谢谢大家!

更新1:


我还尝试设置ck.pem文件的完整路径,但也无法修复错误

好吧,我终于明白了!在处理此问题2天后

因此,对于遇到此问题的任何其他人:

从以下站点下载委托证书:

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

然后,在push.php文件中,设置密码短语的上下文后,添加以下行:
stream\u context\u set\u选项($ctx、'ssl','cafile','trust\u 2048\u ca.cer')

更新至macOS Sierra 10.12.4


问题出在macOS Sierra的新PHP版本中。 他们改变了它使用证书的方式

我建议对已被接受的答案稍作修改,以使事情变得明确

在创建流上下文的过程中,必须设置路径和其他参数,如

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

添加

stream\u context\u set\u选项($ctx,'ssl','verify\u peer',false)

这会破坏服务器验证。
在上面的一条评论中,推荐了百万分之一的应用。

更新至macOS sierra 10.12.5

请加上

stream_context_set_option($ctx, 'ssl', 'verify_peer', false);

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

您确定正确导出了.p12吗?确保在从数据库导出私钥时使用私钥,而不仅仅是公钥keychain@Emilie我只导出了私钥。我没有导出公钥,因为教程也没有告诉我。
$ctx
的值是多少,上面设置了哪些选项?@oflanabhra options set:stream_context_set_option($ctx,'ssl','local_cert',$this->certificate);stream_context_set_选项($ctx,'ssl','passphrase',$this->passphrase)$ctx打印出资源id#9当然,我不知道这是什么意思。
$this->certificate
应该是本地证书的绝对文件路径。这帮了大忙!答案中的URL现在已断开。现在正确的方法是,向下滚动到Trust.net Certificate Authority(2048)。我希望我能在5小时前找到你的帖子!我什么都试了,真是费劲。我注意到,如果我从url中删除了“ssl://”,脚本就会工作,但我从未在iPhone上收到推送通知。我遇到一个人,他说要添加stream\u context\u set\u选项($ctx,'ssl','verify\u peer',false);这会破坏服务器验证。作为一个故障排除的想法,我尝试了一下,结果成功了。那时,我知道问题在于服务器验证。早些时候,我下载了委托证书,并将其添加到我的系统密钥链中,但这没有帮助。我真是太感谢你了!!!谢谢!在MacOS Sierra中,这就是解决方案!如果可以的话,我会把你的答案投两次赞成票。我被困在这上面好几天了,我开始把头发扯下来。谢谢!