2

変換を行うコードがありますが、実行中の exec のサポートがアクティブ化されていないため、ネイティブ 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 を返します

4

2 に答える 2

6

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');

...その他多数

于 2015-09-16T00:51:56.467 に答える
0

ダンのコメントを参照してください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;
}
于 2015-09-15T21:58:38.607 に答える