【问题标题】:Convert P12 to PEM using PHP and OpenSSL使用 PHP 和 OpenSSL 将 P12 转换为 PEM
【发布时间】:2011-07-22 06:54:13
【问题描述】:

我正在尝试将一些 .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 终端中运行......

感谢阅读。希望你能帮忙

【问题讨论】:

  • 避免使用内置 openssl_pkcs12_read 函数是否有特殊原因?
  • @Charles 如果它有效我会使用它,但我不知道如何用我想要的来实现它。
  • @user,它返回的数据是一个包含私钥的数组,这似乎是您要在此处提取的内容。您应该可以使用openssl_pkey_export_to_fileopenssl_pkey_export 来获取 PEM 格式的密钥。
  • @Charles 我无法让它正常工作openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12 -passin pass: 我如何从一开始就在 PHP 中做到这一点,因为据我所知,它首先需要 .pem 文件,或者根本不需要拿到钥匙。

标签: php macos openssl system


【解决方案1】:
$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();
}

请尝试运行这个 sn-p。将$password 设置为打开文件所需的任何密码。如果没有密码,请将其设置为空。我不相信你的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 正在尝试读取配置文件,但没有权限这样做,尽管它应该给你一个错误。

【讨论】:

  • 谢谢,您将如何为证书位制作文件?感谢您的所有帮助,您真是太棒了。
  • 从 PKCS12 文件中读取证书后,证书将可能位于 $result['cert'] 中。您应该可以使用openssl_x509_export 来完成这项工作。 (注意!如果您复制并粘贴了我的代码,我会重复使用一些可能会造成问题的变量名称。您需要相应地进行调整。)
猜你喜欢
  • 2015-03-07
  • 2012-03-31
  • 2023-03-20
  • 2014-09-01
  • 2014-11-26
  • 2023-03-04
  • 2020-10-30
  • 2012-08-13
  • 2013-02-15
相关资源
最近更新 更多