p12到pem文件使用php
Posted
技术标签:
【中文标题】p12到pem文件使用php【英文标题】:p12 to pem file using php 【发布时间】:2012-08-17 08:25:45 【问题描述】:我检查了这个url 并按照步骤从 p12 文件生成 pem 文件。下面是生成pem文件的代码。
....
if ($this->file->save($uploadDirectory . $filename . '.' . $ext))
$filenamewithpath = $uploadDirectory . $filename . '.' . $ext;
$handle = fopen($filenamewithpath, 'r');
$p12buf = fread($handle, filesize($filenamewithpath));
fclose($file);
$password = @$p12pwd;
$results = array();
$worked = openssl_pkcs12_read($p12buf, $results, $password);
//d($results); exit;
if ($worked)
//echo '<pre>', print_r($results, true), '</pre>';
$new_password = null;
$result = null;
$worked = openssl_pkey_export($results['pkey'], $result, $new_password);
if($worked)
//echo "<pre>It worked! Your new pkey is:\n", $result, '</pre>';
file_put_contents( $uploadDirectory . $filename . '.pem',$result);
return array(
'success' => true,
'filename'=>$filename . '.pem',
'uploaddir' =>$uploadDirectory,
);
else
return array('error' => openssl_error_string());
else
return array('error' => openssl_error_string());
....
我让它工作正常,生成的 pem 文件存储在给定目录中。现在我正在尝试使用这个 pem 文件进行推送通知。检查下面的代码,
<?php
$apnsHost = 'gateway.sandbox.push.apple.com';
//$apnsHost = 'gateway.push.apple.com';
$apnsCert = 'test.pem';
$apnsPort = 2195;
$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
$apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext);
$payload['aps'] = array('alert' => 'this is test!', 'badge' => 1, 'sound' => 'default');
$output = json_encode($payload);
$token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
$token = pack('H*', str_replace(' ', '', $token));
$apnsMessage = chr(0) . chr(0) . chr(32) . $token . chr(0) . chr(strlen($output)) . $output;
//var_dump($apnsMessage); exit;
fwrite($apns, $apnsMessage);
@socket_close($apns);
fclose($apns);
?>
当我运行这段代码时,我得到了以下错误,
Warning: stream_socket_client(): Unable to set local cert chain file `test.pem'; Check that your cafile/capath settings include details of your certificate and its issuer in /var/www/html/myserver/apns/test.php on line 13
Warning: stream_socket_client(): failed to create an SSL handle in /var/www/html/myserver/apns/test.php on line 13
Warning: stream_socket_client(): Failed to enable crypto in /var/www/html/ela/apns/test.php on line 13
Warning: stream_socket_client(): unable to connect to ssl://gateway.sandbox.push.apple.com:2195 (Unknown error) in /var/www/html/myserver/apns/test.php on line 13
Warning: fwrite() expects parameter 1 to be resource, boolean given in /var/www/html/myserver/apns/test.php on line 20
Warning: fclose() expects parameter 1 to be resource, boolean given in /var/www/html/myserver/apns/test.php on line 23
请提出解决此问题的建议。
【问题讨论】:
您可能还需要在 pem 中添加中间证书,或者最近的 ca 包也可以。 @jack 谢谢,这个 ["cert"] => string(1996) "-----BEGIN CERTIFICATE----- (取自 $results 数组) 需要添加? 拥有证书是一回事,但您需要一些东西来验证它,您可以谷歌 curl cacert 下载捆绑文件 【参考方案1】:我会打电话给
'openssl pkcs12 -in cert.p12 -inpass pass:password ...something.. ..something...'
在命令行上并尝试获取或通过管道返回其输出。也许在 php 中有一个包装器,否则系统命令似乎是最简单的方法。
【讨论】:
@eirikima 我找到了这个forum.nusphere.com/… 并尝试了它。但不工作。【参考方案2】:我在为 ios 开发时遇到了同样的问题。我们获得了 *.cer 证书并使用以下命令行将其更改为 *.pem: openssl x509 -inform der -in aps_production_identity.cer -out aps_production_identity.pem
如果这不起作用,请确保包含此处所示的私钥: Apple Push Notification Service
【讨论】:
以上是关于p12到pem文件使用php的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Keytool 中使用 pem 和密钥文件生成 p12 文件