【问题标题】:Is it possible to convert .cer and a .key files to .pem by only using php openssl functions?是否可以仅使用 php openssl 函数将 .cer 和 .key 文件转换为 .pem?
【发布时间】:2015-06-20 20:14:49
【问题描述】:

我已经将公钥 (.cer) 和私钥 (.key) 转换为 pem 格式,但我使用命令行将它们转换如下:

$openSSLpath = "c:\OpenSSL-Win64\bin\openssl.exe";   //Path to OpenSSL exe
$path = "c:\appserver\Apache2.2\htdocs\FIEL";        //Path to Project Folder
$rutaCer = $path.'\GAMA600504JP1.cer';
$rutaKey = $path.'\GAMA600504JP1.key';
$passwordKey = '12345678a';

$cmdKey = $openSSLpath." pkcs8 -inform DER -in ".$rutaKey." -passin pass:".$passwordKey." -out ".$rutaKey.".pem";
exec($cmdKey);

$cmdCer = $openSSLpath." x509 -inform DER -outform PEM -in ".$rutaCer." -pubkey -out ".$rutaCer.".pem";
exec($cmdCer);

这会正确生成 .pem 文件,但我需要知道是否可以通过使用 PHP 的任何其他方式来执行此操作。请注意,我对 openSSL 完全陌生,这是我在 PHP 上发现的唯一方法。

为此,我必须确保 OpenSSL 正确定位并安装在我的服务器上,并且为了转换为 .pem,我必须将 .cer 和 .key 文件临时保存在服务器中,不建议这样做出于安全原因。

还有其他方法吗?

【问题讨论】:

    标签: php openssl key private public


    【解决方案1】:

    您可以通过简单的代码轻松地将您的 der 数据转换为 PEM。

    $rutaCer = file_get_contents($path.'\GAMA600504JP1.cer');
    $rutaKey = file_get_contents($path.'\GAMA600504JP1.key');
    
    echo "-----BEGIN PRIVATE KEY-----\n" . chunk_split(base64_encode($rutaKey), 64, "\n") . "-----END PRIVATE KEY-----";
    echo "-----BEGIN CERTIFICATE-----\n" . chunk_split(base64_encode($rutaCer), 64, "\n") . "-----END CERTIFICATE-----";
    
    // Save anywhere
    

    PHP 具有导出到 PEM 的功能,但从二进制 DER 格式加载密钥/证书时存在问题。

    另一种方法是使用phpsec库。

    【讨论】:

    • 嗨 kba,当我使用你的代码时,我得到的 pem 文件与我从 OpenSSL 得到的完全不同
    • 有什么区别?在 base64 字符串或标题(BEGIN,END)中?您使用什么命令来生成 .cer 和 .key 文件?如果我不知道您的文件中到底有什么或 openssl 命令的输出有何不同,我将无法进一步帮助您。
    猜你喜欢
    • 2020-06-11
    • 2014-10-08
    • 2011-07-22
    • 2019-05-24
    • 2020-10-30
    • 2012-12-20
    • 1970-01-01
    • 2018-11-13
    • 2020-02-13
    相关资源
    最近更新 更多