用PHP将.key文件从DER格式加载到PEM格式


Load a .key file from DER format to PEM with PHP

我有一个代码,使转换,但需要做它与本地PHP函数,因为它不支持运行exec:

exec("openssl pkcs8 -inform DER -in 'archivo.key' -out 'archivo.key.pem' -passin pass:'lacontrasena'");

有人能帮我翻译成本地PHP函数吗?可以是openssl,也可以是库。

//

更新

这是我使用der2pem函数的代码:

function der2pem($der_data) {
   $pem = chunk_split(base64_encode($der_data), 64, "'n");
   $pem = "-----BEGIN PRIVATE KEY-----'n".$pem."-----END PRIVATE KEY-----'n";
   return $pem;
}
$keyfile = 'myFileDER.key';
$keyFileContent = file_get_contents($keyfile);
$pemContent = der2pem($keyFileContent);
file_put_contents('llavetemp.pem', $pemContent);
$private_key1 = openssl_pkey_get_private($pemContent);
var_dump($private_key1);

var_dump返回boolean false

您可以轻松地使用uri2x的答案和第一个google结果中的一些信息。PEM只是二进制DER文件的base64编码形式。添加了一些元数据,您可以使用它做任何事情。

所以如果你修改函数(由uri2x发布!)如下:

function der2pem($der_data, $type='CERTIFICATE') {
   $pem = chunk_split(base64_encode($der_data), 64, "'n");
   $pem = "-----BEGIN ".$type."-----'n".$pem."-----END ".$type."-----'n";
   return $pem;
}

你现在可以叫它:

$private_key=file_get_contents('archivo.key');
file_put_contents('archivo.key.pem',der2pem($private_key,'PRIVATE KEY');

,您可以转换几乎所有需要在加密关注点中传输的内容:

//certificates
$private_key=file_get_contents('certificate');
echo der2pem($private_key,'CERTIFICATE');//here, certificate isn't even required because it's the default
//GPG/PGP Public Keys
$pgp_public_key=file_get_contents('pgp_public_key');
echo der2pem($private_key,'PGP PUBLIC KEY BLOCK');
//CSR
$certificate_signing_request=file_get_contents('csr');
echo der2pem($private_key,'CERTIFICATE REQUEST');

…还有很多人!

参见dan对php.net的评论:

使用以下代码将DER转换为PEM, PEM转换为DER。

<?php
$pem_data = file_get_contents($cert_path.$pem_file);
$pem2der = pem2der($pem_data);
$der_data = file_get_contents($cert_path.$der_file);
$der2pem = der2pem($der_data);
function pem2der($pem_data) {
   $begin = "CERTIFICATE-----";
   $end   = "-----END";
   $pem_data = substr($pem_data, strpos($pem_data, $begin)+strlen($begin));   
   $pem_data = substr($pem_data, 0, strpos($pem_data, $end));
   $der = base64_decode($pem_data);
   return $der;
}
function der2pem($der_data) {
   $pem = chunk_split(base64_encode($der_data), 64, "'n");
   $pem = "-----BEGIN CERTIFICATE-----'n".$pem."-----END CERTIFICATE-----'n";
   return $pem;
}