我写了一个测试php页面,它只发送一个通用推送通知,它间歇性地工作。有时它会传递消息,有时我会收到此错误:
“消息:stream_socket_client()[function.stream-socket-client]:无法设置本地证书链文件`/var/www/ninerobot.com/public/mlb/certs/mlbtr-push-dev.pem' ;检查您的cafile / capath设置是否包含证书及其发行人的详细信息“
你知道如何解决这个问题吗?
我在Apple的文档中看到它说“注意:要与APN建立TLS会话,必须在提供商的服务器上安装Entrust Secure CA根证书。如果服务器运行的是Mac OS X,则此根证书已经在其他系统上,证书可能不可用。您可以从Entrust SSL证书网站下载此证书。“这是否意味着我需要做什么?
答案 0 :(得分:13)
我也更加努力去做同样的事情。最终我找到了通过PHP全局网址发送推送通知的解决方案。请尝试以下步骤。在此之前,我希望你们都知道生成3个证书 PushChat.certSigningRequest,pushkey.p12& aps_development.cer(csr,p12,cer)
打开终端并逐步运行以下命令:
# Make sure terminal refers your correct certificate path.
$ cd ~/Desktop/
# Ask system administrator to open if its not connected
$ telnet gateway.sandbox.push.apple.com 2195
Trying 17.110.227.35...
Connected to gateway.sandbox.push-apple.com.akadns.net.
Escape character is '^]'.
# Convert .cer to .pem
$ openssl x509 -in aps_development.cer -inform der -out PushCert.pem
# Convert .p12 to .pem. Enter your pass pharse which is the same pwd that you have given while creating the .p12 certificate. PEM pass phrase also same as .p12 cert.
$ openssl pkcs12 -nocerts -out PushKey1.pem -in pushkey.p12
Enter Import Password:
MAC verified OK
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
# To remove passpharse for the key to access globally. This only solved my stream_socket_client() & certificate capath warnings.
$ openssl rsa -in PushKey1.pem -out PushKey1_Rmv.pem
Enter pass phrase for PushChatKey1.pem:
writing RSA key
# To join the two .pem file into one file:
$ cat PushCert.pem PushKey1_Rmv.pem > ApnsDev.pem
然后最后将SimplePush.php移动到ApnsDev.pem文件位置。两个文件都在同一个文件夹中。并更改设备令牌,密码短语,证书名称( ApnsDev.pem ),消息...在simplepush.php中使用以下URL下载文件。 的 http://d1xzuxjlafny7l.cloudfront.net/downloads/SimplePush.zip 强> 然后在终端或域服务器中执行文件
$ php simplepush.php
或
www.Domainname.com/push/simplepush.php // Now, url shows 'Connected to APNS Message successfully delivered'.
多数民众赞成,推送通知将飞行并到达特定的IOS设备。
如果您想发送徽章'然后在simplepush.php中更改有效负载代码,如下所示,
// Construct the notification payload body:
$badge = 1;
$sound = 'default';
$body = array();
$body['aps'] = array('alert' => $message);
if ($badge)
$body['aps']['badge'] = $badge;
if ($sound)
$body['aps']['sound'] = $sound;
// End of Configurable
// Encode the payload as JSON:
$payload = json_encode($body);
现在再次运行php文件,会出现带有红色圆圈徽章编号的应用程序图标。
答案 1 :(得分:7)
使用此核对清单来解决此问题:
答案 2 :(得分:0)
除了史蒂夫N的一个很好的答案,让我补充最后一点。
issuer=
,subject=
等,您的文件以-----BEGIN CERTIFICATE
开头。在转换证书文件期间可能会意外删除它。答案 3 :(得分:0)
可能与 OP 的 Q 无关,但我尝试使用 all openssl 语句和 all 不同的标志,同时尝试与 PHP \SoapClient(...)
和3天后,我终于找到了一个对我有用的解决方案。发布这样下一个家伙(tte)可能会发现这比我更容易。
$ cd path/to/certificate/
$ openssl pkcs12 -in personal_certificate.pfx -out public_key.pem -clcerts
首先您必须输入一次 YOUR_CERT_PASSWORD
,然后输入两次 DIFFERENT_PASSWORD!
。后者可能可供所有有权访问代码的人使用。
<?php
$wsdlUrl = "https://example.com/service.svc?singlewsdl";
$publicKey = "rel/path/to/certificate/public_key.pem";
$password = "DIFFERENT_PASSWORD!";
$params = [
'local_cert' => $publicKey,
'passphrase' => $password,
'trace' => 1,
'exceptions' => 0
];
$soapClient = new \SoapClient($wsdlUrl, $params);
var_dump($soapClient->__getFunctions());