使用PHP和OpenSSL将P12转换为PEM

时间:2011-03-24 16:15:47

标签: php macos openssl system

我正在尝试将一些.p12文件转换为.pem。

在我的Mac上它可以工作,没有交互,因为我把密码放在代码中,但是当我使用这段代码时:

system('openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12 -passin pass:');
system('openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12 -passout pass:1234 -passin pass:');
system('openssl rsa -in apns-dev-key.pem -out apns-dev-key-noenc.pem -passin pass:1234');
system('cat apns-dev-cert.pem apns-dev-key-noenc.pem > apns-dev.pem');

它会生成空白文件。

我的文件权限是755.对于passin,密码设置为空,这就是为什么它们是空白的...这里没有system()的所有代码都在mac终端中工作..

感谢阅读。希望你能帮忙

1 个答案:

答案 0 :(得分:20)

$filename = 'apns-dev-cert.p12';
$password = '...';
$results = array();
$worked = openssl_pkcs12_read(file_get_contents($filename), $results, $password));
if($worked) {
    echo '<pre>', print_r($results, true), '</pre>';
} else {
    echo openssl_error_string();
}

请尝试运行此代码段。将$password设置为打开文件所需的密码。如果没有密码,请将其设置为null。我不相信你的openssl命令需要一个。

应该使用所需的私钥输出,可能在$results['pkey']内。

如果您在那里看到私钥,那么您可以将其传递给openssl_pkey_export以PEM格式获取,然后您可以将其写入文件:

$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>';
} else {
    echo openssl_error_string();
}

如果需要,请将$new_password设置为您想要的pkey密码。

根据我在各种文档页面上阅读的内容, 应该为您工作。


如果确实希望通过炮轰继续使用openssl命令,请考虑使用proc_open代替system,以便您可以正确捕获错误消息。

OpenSSL也可能正在尝试读取配置文件,并且没有权限这样做,尽管应该给你一个错误。