推送通知错误:“无法设置本地证书链文件”

时间:2010-07-04 17:31:59

标签: iphone push push-notification apple-push-notifications

我写了一个测试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证书网站下载此证书。“这是否意味着我需要做什么?

4 个答案:

答案 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)

使用此核对清单来解决此问题:

  1. 您是否通过these等指示创建合法证书
  2. 您的 .pem文件是否可读您的网络服务器进程(即权限和文件位置是否良好)?许多设置运行apache,例如,在“www-data”用户/组下运行。附注:确保访问者无法通过浏览来查看.pem文件。
  3. 您的服务器是否安装了 Entrust安全CA根证书(2048位)?如果没有,请按照特定服务器操作系统的下载/安装说明进行操作。
  4. 出站TCP端口2195是否打开?许多托管服务提供商默认情况下不打开此出站端口。

答案 2 :(得分:0)

除了史蒂夫N的一个很好的答案,让我补充最后一点。

  1. 确保您了解警告,尤其是包含证书及其颁发者的详细信息。您可能没有.pem文件中的阻止,即issuer=subject=等,您的文件以-----BEGIN CERTIFICATE开头。在转换证书文件期间可能会意外删除它。

答案 3 :(得分:0)

可能与 OP 的 Q 无关,但我尝试使用 all openssl 语句和 all 不同的标志,同时尝试与 PHP \SoapClient(...) 和3天后,我终于找到了一个对我有用的解决方案。发布这样下一个家伙(tte)可能会发现这比我更容易。

GitBash

$ cd path/to/certificate/
$ openssl pkcs12 -in personal_certificate.pfx -out public_key.pem -clcerts

首先您必须输入一次 YOUR_CERT_PASSWORD,然后输入两次 DIFFERENT_PASSWORD!。后者可能可供所有有权访问代码的人使用。

PHP

<?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());