通过php脚本发送iOS通知:'无法设置私钥文件'

时间:2014-01-09 07:13:56

标签: php ios apple-push-notifications

我使用了众所周知的Ray Wanderlich tutorial的php脚本在开发阶段发送推送通知。在我创建pem文件(来自p12和aps_development.cer文件)并在php脚本中提到设备令牌后,它们被正确触发。

但是,当我使用具有生产p12和aps_production.cer文件的pem文件时,通知甚至没有到达APNS服务器。它在本地服务器端本身显示以下错误。

Unable to set private key file `/Users/administrator/Desktop/SimplePush/ck.pem' in /Users/administrator/Desktop/SimplePush/simplepush.php on line 22

Warning: stream_socket_client(): failed to create an SSL handle in /Users/administrator/Desktop/SimplePush/simplepush.php on line 22

Warning: stream_socket_client(): Failed to enable crypto in /Users/administrator/Desktop/SimplePush/simplepush.php on line 22

Warning: stream_socket_client(): unable to connect to ssl://gateway.push.apple.com:2195 (Unknown error) in /Users/administrator/Desktop/SimplePush/simplepush.php on line 22

可能是什么原因。 p12文件没有任何密码(虽然我已经为pem文件配置了密码),这就是它在php脚本中给出的方式。

// Put your private key's passphrase here:
$passphrase = '';

7 个答案:

答案 0 :(得分:5)

这不是正确的p12文件。我从Keychain导出了正确的p12文件,并且进展顺利。

经验教训 -

  1. 如果您使用的p12和cer文件彼此不对应,显然在连接的pem文件创建过程中不会显示任何错误。但是当你执行脚本时,会显示一个错误。

  2. 上述错误消息并不一定意味着p12文件的密码错误。它们也可能意味着p12文件与使用的cer文件不对应。

答案 1 :(得分:3)

如果从命令行运行该文件,可能会尝试提供ck.pem文件的完整路径

更改行: stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');

stream_context_set_option($ctx, 'ssl', 'local_cert', '/path/to/your/file/ck.pem');

为我工作

答案 2 :(得分:3)

$passphrase = '1234'设置为$passphrase = "1234"可以解决我的问题。

答案 3 :(得分:2)

如果文件ck.pem确实存在于该位置,则可能是php脚本无法访问它。我会将文件夹/文件的权限更改为更宽松的或尝试以超级用户身份运行脚本:

sudo php simplepush.php

修改1:

经过一些研究后,看起来pem文件可能处于意外格式。您可以尝试更改文件中组合的证书的顺序。您还可以尝试使用单独的文件并使用'stream_context_set_option'函数指定每个文件。

编辑2:

如果可以,请尝试以与教程相同的方式设置生产文件的密码。它可能需要使用密码才能工作。同样,pem文件听起来像是错误的,要么生成错误,要么丢失,要么格式错误。检查文件。如果不是安全风险,甚至可以在你的问题中发布它。你可以在搞清楚错误之后重新生成一把新钥匙。

答案 4 :(得分:1)

我得到了同样的错误。

我确定我的pem文件是正确的,我遵循本指南:https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ProvisioningDevelopment.html

调试了很多,我发现我忘记了密码。

PS:我使用了这个PHP脚本:https://github.com/duccio/ApnsPHP,也许它可以帮到你。

答案 5 :(得分:1)

我遇到了同样的问题,我使用1234作为密码。 而不是写$ passphrase ='1234'; 我写的是$ passphrase = 1234;它工作正常

答案 6 :(得分:0)

始终确保不使用旧的APNS代码(例如,您为开发和生产应用程序使用相同的数据库表)。这会导致Apple APNS服务断开连接,因为它收到了无效的APNS代码,因为不同的APNS代码用于开发和实际发布的应用程序。

另一句话:如果您将应用发布到appstore,请不要忘记重新生成密钥对。开发证书不能在生产中使用!