2015-09-15 60 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