使用PHP和OpenSSL将P12转换为PEM

use*_*268 6 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');
Run Code Online (Sandbox Code Playgroud)

它会生成空白文件.

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

谢谢阅读.希望你能帮忙

Cha*_*les 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();
}
Run Code Online (Sandbox Code Playgroud)

请尝试运行此代码段.设置$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();
}
Run Code Online (Sandbox Code Playgroud)

$new_password如果需要,请设置为所需的pkey密码.

根据我在各种文档页面上阅读的内容,这应该适合您.


如果您确实希望openssl通过shelling out 继续使用该命令,请考虑使用proc_open而不是system,以便您可以正确捕获错误消息.

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