我正在使用Ray Wenderlich推送教程作为设置推送我的应用程序的参考,我已经做了几十次,几十次,并且它总是顺利,直到现在。
当执行php文件手动测试发送推送时,我收到错误:
'Unable to set private key file ... ck.pem'
在最后一行:
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
// Open a connection to the APNS server
$fp = stream_socket_client(
'ssl://gateway.sandbox.push.apple.com:2195', $err,
$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
ck.pem是ssl证书和私钥的串联,我可以使用以下命令来使用它们:
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushCert.pem -key PushKey.pem
当我执行此操作时,我获得了一个关于SSK握手读/写N字节的大量调整和输出,表明它是成功的,因此证书和密钥必须有效。
所以我不明白为什么在用作上面的openssl命令行的参数时单独使用证书和密钥没有问题,但是在php文件的连接中使用时。
在最初得到问题之后我删除了所有内容 - 我清除了钥匙串中的所有证书和密钥,删除了所有配置文件等等。整个批次再次以干净的石板开始,以确保我没有制作一个错误的地方。相同的结果 - 继续获取“无法设置私钥文件”。
我看到过去的帖子,有人遇到了同样的问题,他们通过使用sudo执行php文件解决了这个问题,但这对我没用。
任何建议,这都让我很生气,特别是因为我之前成功地做了几十次。
答案 0 :(得分:3)
我有过一次这样的事情,经过几个小时的挫折之后,我跟踪问题直到我使用TextEdit编辑.php文件的内容而TextEdit插入了不可见的字符。
不在行的末尾,实际上在行本身,即如果Ray Wenderlich文件中的原始文本是这样的:
// Put your private key's passphrase here:
$passphrase = ‘cpushchat';
然后在使用TextEdit更改密码后,您在查看时看起来像这样:
// Put your private key's passphrase here:
$passphrase = ‘mypassword';
但如果您在十六进制编辑中查看它,TextEdit实际上做的是插入不可见(在文本查看器中不可见)字符,如下所示:
// Put your private key's passphrase here:
$passphrase = ‘E28098mypassword';
这导致密码当然不正确,从而导致该消息。