2015-09-15 30 views
0

为PEM我,使转化的代码,但需要与本地的PHP函数来做到这一点,因为它没有被激活运行EXEC支持:负载从DER格式的.key文件与PHP

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布尔值false

+0

不太清楚你的问题是什么--PHP在他们的文档中有这样的可用文件:http://php.net/manual/en/book.openssl.php – Signus

+0

To traduce:“exec(”openssl pkcs8 -inform DER -in'archivo.key'-out'archivo.key.pem'-passin pass:'lacontrasena'“);”以php openssl原生。 – Nestor

回答

0

查看php.netdan's评论:

使用以下代码将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; 
} 
+0

我需要转换一个密钥文件不是证书,所以我把以前使用的参考代码生成一个PEM文件,该文件以----- BEGIN PRIVATE KEY开头----- – Nestor

1

您可以轻松地使用uri2x的答案,从第一款谷歌结果的几个信息。 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'); 

...和many其他!

+0

当我尝试使用得到的结果时通过这样的功能: $ private_key1 = openssl_pkey_get_private($ pemContent); var_dump($ private_key1); //返回布尔值false – Nestor

+0

嗯,我只是修复了一个小错误 - 请再试一次。务必使用'PRIVATE KEY'作为第二个参数调用此函数! – tillz