【问题标题】:iOS Push notification sending erroriOS推送通知发送错误
【发布时间】:2014-03-27 17:47:48
【问题描述】:

我是一名 iOS 应用程序开发人员,对 php 了解不多。我正在关注raywenderlich push notification tutorial 为推送通知生成 SSL 证书和私钥。

我按照这些步骤操作了 3-4 次,但它不起作用。我之前也按照相同的步骤进行操作。

我认为问题在于我在测试使用 SSL 证书连接到 APNS 服务器时得到的响应。我得到以下回应。

CONNECTED(00000003)
depth=1 /C=US/O=Entrust, Inc./OU=www.entrust.net/rpa is incorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust Certification Authority - L1C
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
 0 s:/C=US/ST=California/L=Cupertino/O=Apple Inc./OU=iTMS Engineering/CN=gateway.sandbox.push.apple.com
   i:/C=US/O=Entrust, Inc./OU=www.entrust.net/rpa is incorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust Certification Authority - L1C
 1 s:/C=US/O=Entrust, Inc./OU=www.entrust.net/rpa is incorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust Certification Authority - L1C
   i:/O=Entrust.net/OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/OU=(c) 1999 Entrust.net Limited/CN=Entrust.net Certification Authority (2048)
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFGzCCBAOgAwIBAgIETBz90jANBgkqhkiG9w0BAQUFADCBsTELMAkGA1UEBhMC
VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0
Lm5ldC9ycGEgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW
KGMpIDIwMDkgRW50cnVzdCwgSW5jLjEuMCwGA1UEAxMlRW50cnVzdCBDZXJ0aWZp
Y2F0aW9uIEF1dGhvcml0eSAtIEwxQzAeFw0xMjA1MjUyMzM3NDZaFw0xNDA1MzEw
NTA4NDhaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTESMBAG
A1UEBxMJQ3VwZXJ0aW5vMRMwEQYDVQQKEwpBcHBsZSBJbmMuMRkwFwYDVQQLExBp
VE1TIEVuZ2luZWVyaW5nMScwJQYDVQQDEx5nYXRld2F5LnNhbmRib3gucHVzaC5h
cHBsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC/r1z4BRFu
DIU9/vOboVmd7OwaPPLRtcZiZLWxSyG/6KeRPpaeaC6DScvSDRoJuIeTDBup0bg4
08K0Gzh+lfKRlJOC2sma5Wgvk7oP4sty83My3YCZQv4QvgDhx+seONNs6XiA8Cl4
ingDymWGlzb0sTdfBIE/nWiEOtXQZcg6GKePOWXKSYgWyi/08538UihKK4JZIOL2
eIeBwjEwlaXFFpMlStc36uS/8oy+KMjwvuu3HazNMidvbGK2Z68rBnqnOAaDBtuT
K7rwAa5+i8GYY+sJA0DywMViZxgG/xWWyr4DvhtpHfUjyQgg1ixM8q651LNgdRVf
4sB0PfANitq7AgMBAAGjggFZMIIBVTALBgNVHQ8EBAMCBaAwHQYDVR0lBBYwFAYI
KwYBBQUHAwEGCCsGAQUFBwMCMDMGA1UdHwQsMCowKKAmoCSGImh0dHA6Ly9jcmwu
ZW50cnVzdC5uZXQvbGV2ZWwxYy5jcmwwZQYIKwYBBQUHAQEEWTBXMCMGCCsGAQUF
BzABhhdodHRwOi8vb2NzcC5lbnRydXN0Lm5ldDAwBggrBgEFBQcwAoYkaHR0cDov
L2FpYS5lbnRydXN0Lm5ldC9sMWMtY2hhaW4uY2VyMEAGA1UdIAQ5MDcwNQYJKoZI
hvZ9B0sCMCgwJgYIKwYBBQUHAgEWGmh0dHA6Ly93d3cuZW50cnVzdC5uZXQvcnBh
MB8GA1UdIwQYMBaAFB7xq4kG+EkPATN37hR67hl8kyhNMB0GA1UdDgQWBBSgNiNR
qtTShi8PuJ7UNUEbeE71STAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBBQUAA4IBAQAS
EDkUyBHVdRJnCLHY8w9ec92NWqBYqKiSGP0uVCvgpsJIWDBkCGIw1Olks6mQuS9+
R7VRJJFg7EhtufmoRIvjgntKpTe49sB/lrmiZVQGnhjd6YdyYm9+OBUWRvwketLM
v0S+nxZD0qLLJ9foVUB8zP8LtutqFJ5IZw1xb9eSNzhpKkQ9ylj8MCd4tpXZxICL
Gt327poTXwmjQ+31fz7HCQCowMHccP8kiKM5SeYC9q+nkmdaozHVvw4e1RsP+EWO
vPtcH1x1BCkTJajmrO7JuRPLuBEnZGSPUVFRKWP9jy0a28VnJek+oA7rRMRD8irU
fMGbLqkGn8YogdPqe5T1
-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Cupertino/O=Apple Inc./OU=iTMS Engineering/CN=gateway.sandbox.push.apple.com
issuer=/C=US/O=Entrust, Inc./OU=www.entrust.net/rpa is incorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust Certification Authority - L1C
---
No client certificate CA names sent
---
SSL handshake has read 2731 bytes and written 2177 bytes
---
New, TLSv1/SSLv3, Cipher is AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : AES256-SHA
    Session-ID: 
    Session-ID-ctx: 
    Master-Key: 0E813189A9AA0F93F3C996DB3D80240F742EB24656AEED9DC18043DCEDD854E9B1C4798098312EB7F6CAB23B10FF343C
    Key-Arg   : None
    Start Time: 1393333259
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)


在响应开始时,它给出错误verify error:num=20:unable to get local issuer certificate。在回复的后半部分还写着No client certificate CA names sent。 我不知道这些事情,但我怀疑问题出在这些错误上。

编辑:使用教程中提供的示例 php 脚本发送通知时出错。

Warning: stream_socket_client(): Unable to set private key file `/Users/akashpatel/Desktop/SimplePush/ck.pem' in /Users/akashpatel/Desktop/SimplePush/simplepush.php on line 25

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

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

Warning: stream_socket_client(): unable to connect to ssl://gateway.sandbox.push.apple.com:2195 (Unknown error) in /Users/akashpatel/Desktop/SimplePush/simplepush.php on line 25
Failed to connect: 0 

编辑: 使用这个app(segev 在他的回答中建议)我测试了证书/私钥是否有任何问题。我可以成功收到通知。所以我想问题不在于证书/私钥。

我正在使用的 PHP 脚本:

<?php

$deviceToken = 'r34f34f5g45g5y56u76hj676elfjn4urno43f958gh945g8g7';

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

// Put your alert message here:
$message = 'Received push notification!';

////////////////////////////////////////////////////////////////////////////////

$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);

if (!$fp)
    exit("Failed to connect: $err $errstr" . PHP_EOL);

echo 'Connected to APNS' . PHP_EOL;

// Create the payload body
$body['aps'] = array(
    'alert' => $message,
    'sound' => 'default'
    );

// Encode the payload as JSON
$payload = json_encode($body);

// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;

// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));

if (!$result)
    echo 'Message not delivered' . PHP_EOL;
else
    echo 'Message successfully delivered' . PHP_EOL;

// Close the connection to the server
fclose($fp);

编辑:我的脚本在生产服务器中使用时可以工作。但是我会保持这个问题的开放,因为它在本地服务器中不起作用。建议可能会帮助其他在生产服务器中不起作用的人。

【问题讨论】:

  • 你的 ssl 命令是什么?你试过了吗:openssl s_client -connect host:443 -cert cert_and_key.pem -key cert_and_key.pem -state -debug
  • @Radu cert_and_key.pem 在您的命令中指定了两次。它是正确的还是错误的?我使用命令openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert Cert.pem -key Key.pem
  • @Radu 我尝试将端口更改为443,但出现错误。 connect: Connection refused, connect:errno=61.
  • 尝试向设备推送消息时收到的错误是什么?
  • @Radu 我没有尝试这样做,因为即使这样也行不通。我尝试使用教程提供的 php 脚本发送通知。我会发布我在执行此操作时遇到的错误。

标签: php ios ssl openssl push-notification


【解决方案1】:

当我使用我在本地服务器上遵循的教程提供的 PHP 脚本进行测试时,我不知道出现了什么问题。但是当我使用生产服务器进行测试时,它正在发送通知。

【讨论】:

    【解决方案2】:

    查看错误:

    CONNECTED(00000003) 深度=1 /C=US/O=委托, Inc./OU=www.entrust.net/rpa 通过引用并入/OU=(c) 2009 Entrust, Inc./CN=Entrust 证书颁发机构 - L1C 验证 error:num=20:unable to get local issuer certificate verify return:0

    看看你如何设置应用上下文到流选项:

    $ctx = stream_context_create();
    stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
    stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
    

    我使用与您相同的教程,在故障排除部分阅读项目符号 #3

    无法获取本地颁发者证书。这个错误意味着 无法验证来自服务器的证书。要解决这个问题,你 需要下载 Entrust CA 根证书。这可以做到 从终端使用命令: curl -O https://www.entrust.net/downloads/binary/entrust_2048_ca.cer那你 还需要添加stream_context_set_option($ctx, 'ssl', 'cafile', 'entrust_2048_ca.cer');

    下载entrust_2048_ca.cer

    确保您的所有证书与 PHP 脚本位于同一目录中。

    将您的代码更改为以下内容:

    //applying context to stream option
    stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
    stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
    stream_context_set_option($ctx, 'ssl', 'cafile', 'entrust_2048_ca.cer');
    

    你现在应该很好了。

    【讨论】:

    • 我应该在我的问题中提到。我已经试过了。但不工作。
    • 你有空chat
    • @Geek 对此尝试有何反馈?
    • 它没有用。我在聊天中给出了反馈。我认为在聊天对话中写作会给你通知..
    • 不明白那是什么。他们问的是哪个键和 ID?
    【解决方案3】:

    推送通知有很多问题,您需要一一解决。

    暂时忘记 php 代码。 转到here 并下载最新版本。

    这是一个很棒的小型应用程序,它为您完成所有服务器端,并将向您的设备发送推送通知。如果可行,您可以继续执行 php 代码,但我怀疑您的问题出在应用证书 \ 密钥上。

    【讨论】:

    • 我下载了应用程序并使用相同的证书发送了通知。我收到了通知。现在这意味着证书和密钥都很好。还有什么其他问题?顺便说一句,感谢和 +1 链接到应用程序。至少我知道我不需要再次创建它们来查看它们是否存在问题。
    • 感谢伟大的小应用程序测试设置:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多