Загрузите файл .key из формата DER в PEM с помощью 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 возвращает логическое значение false


person Nestor    schedule 15.09.2015    source источник
comment
Не совсем уверен, в чем ваша проблема - PHP легко доступен в документации: php.net /manual/en/book.openssl.php   -  person Signus    schedule 16.09.2015
comment
Превратить: exec(openssl pkcs8 -inform DER -in 'archivo.key' -out 'archivo.key.pem' -passin pass:'lacontrasena'); на родной php openssl.   -  person Nestor    schedule 16.09.2015


Ответы (2)


Вы можете легко использовать ответ 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');

...и многие другие!

person tillz    schedule 16.09.2015
comment
Когда я пытаюсь использовать результат, полученный функцией, следующим образом: $private_key1 = openssl_pkey_get_private($pemContent); var_dump($private_key1); // Возвращаем логическое значение false - person Nestor; 16.09.2015
comment
Ну, я только что исправил небольшую ошибку - попробуйте еще раз. Обязательно вызывайте эту функцию с «PRIVATE KEY» в качестве второго параметра! - person tillz; 16.09.2015

См. комментарий 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;
}
person uri2x    schedule 15.09.2015
comment
Мне нужно преобразовать файл ключа, который не является сертификатом, поэтому я помещаю ранее использованный справочный код, который генерирует файл PEM, который начинается с ----- НАЧАТЬ ЧАСТНЫЙ КЛЮЧ ----- - person Nestor; 16.09.2015