使用 PEM 文件在 PHP 中推送通知
Push Notification in PHP using PEM file
我一直在学习 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 错误消息:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE: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
Push notification in PHP
我真的重试了一切。我知道我的密码是正确的。我重新创建了我的证书、pem 文件和密钥。什么都不管用。每次我这样做都会出现同样的错误。
我很困惑。
有没有人有任何建议或知道发生了什么事?
谢谢!
更新 1:
我也试过设置 ck.pem 文件的完整路径,但也没有修复错误。
好吧,我终于明白了!经过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');
已更新至 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',
]
]);
添加
stream_context_set_option($ctx, 'ssl', 'verify_peer', false);
服务器验证失败。
在上面的评论中感谢@百万应用程序中的一个。
更新至 macOS sierra 10.12.5
请添加
stream_context_set_option($ctx, 'ssl', 'verify_peer', false);
问题出在 macOS Sierra
的新 PHP 版本中
我一直在学习 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 错误消息: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE: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
Push notification in PHP
我真的重试了一切。我知道我的密码是正确的。我重新创建了我的证书、pem 文件和密钥。什么都不管用。每次我这样做都会出现同样的错误。
我很困惑。
有没有人有任何建议或知道发生了什么事?
谢谢!
更新 1:
我也试过设置 ck.pem 文件的完整路径,但也没有修复错误。
好吧,我终于明白了!经过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');
已更新至 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',
]
]);
添加
stream_context_set_option($ctx, 'ssl', 'verify_peer', false);
服务器验证失败。 在上面的评论中感谢@百万应用程序中的一个。
更新至 macOS sierra 10.12.5
请添加
stream_context_set_option($ctx, 'ssl', 'verify_peer', false);
问题出在 macOS Sierra
的新 PHP 版本中