Преобразование P12 в PEM с использованием PHP и OpenSSL - PullRequest
6 голосов
/ 24 марта 2011

Я пытаюсь преобразовать некоторые файлы .p12 в .pem.

На моем Mac это работает, без взаимодействия, так как я ввел пароли в код, но когда я использую этот код:

system('openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12 -passin pass:');
system('openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12 -passout pass:1234 -passin pass:');
system('openssl rsa -in apns-dev-key.pem -out apns-dev-key-noenc.pem -passin pass:1234');
system('cat apns-dev-cert.pem apns-dev-key-noenc.pem > apns-dev.pem');

создает пустые файлы.

Мои права доступа к файлу - 755. и для пароля пароли были установлены в ничто, поэтому они пусты ... весь код здесь без system () работает в терминале Mac ..

спасибо за чтение. надеюсь, что вы можете помочь

1 Ответ

20 голосов
/ 25 марта 2011
<code>$filename = 'apns-dev-cert.p12';
$password = '...';
$results = array();
$worked = openssl_pkcs12_read(file_get_contents($filename), $results, $password));
if($worked) {
    echo '<pre>', print_r($results, true), '
'; } еще { echo openssl_error_string (); }

Пожалуйста, попробуйте запустить этот фрагмент. Установите $password на любую фразу-пароль, необходимую для открытия файла. Если пароля нет, установите его на ноль. Я не верю, что это нужно из ваших openssl команд.

Вы должны получить вывод с нужным секретным ключом, вероятно, внутри $results['pkey'].

Если вы видите там свой закрытый ключ, вы можете передать его в openssl_pkey_export, чтобы получить его в формате PEM, который затем можно записать в файл:

<code>$new_password = null;
$result = null;
$worked = openssl_pkey_export($results['pkey'], $result, $new_password);
if($worked) {
    echo "<pre>It worked!  Your new pkey is:\n", $result, '
'; } еще { echo openssl_error_string (); }

Установите $new_password на желаемый пароль pkey, если хотите.

Это должно работать для вас, основываясь на том, что я читаю на различных страницах документации.


Если вы действительно хотите продолжать использовать команду openssl, выдавая оболочку, рассмотрите возможность использования proc_open вместо system, чтобы вы могли правильно отловить ошибку сообщения.

Также возможно, что OpenSSL пытается прочитать файл конфигурации и не имеет разрешения на это, хотя должно выдать вам ошибку об этом.

...