2015-06-10 3 views
1

Я действительно работаю в небольшом проекте для себя, это веб-приложение, которое создает запрос на подпись сертификата, также сертификат .pem/.crt и его .key.Попытка создать сертификат через openssl с использованием shell_exec в PHP

Реальная проблема заключается в том, что я пытаюсь запустить:

shell_exec(openssl ca -config ../openssl.cnf -in $CSR_FILE -out $CRT_FILE) 

И я нахожу эту проблему, что после выполнения этой команды с просьбой о моем CA ключевой фразе, а потом отвечать да дважды, чтобы принять создание сертификата. Я не могу понять, как заставить его работать. Я застрял в этом почти три дня, ни Google, ни переполнение стека не имеют андерсера.

Я попытался запустить команду и добавить еще shell_exec(passphrase) также, передавая кодовую фразу и «y» дважды таким образом.

shell_exec("openssl....","passphrase","y","y") 

Большое спасибо, я ценю всю помощь.

+0

Первое, что я хотел бы сделать, это изменить '../ openssl.cnf' на полный путь - возможно, текущий каталог PHP для команд не относительно местоположения сценария? – halfer

+0

Кроме того, я бы предположил, что вам нужно предоставить параметры консоли, чтобы не требовалось вводить клавиатуру. Возможно ли это с помощью этой консоли? – halfer

+0

(Вы, вероятно, можете делать то, что вы пытаетесь сделать, используя php.net/openssl, кстати, может быть, это было бы проще?). – halfer

ответ

1

Для этого не нужно использовать shell_exec(). Вы можете создать подписанный сертификат slef, используя функцию openssl_csr_new() PHP.

Он генерирует новый CSR (запрос подписи сертификата) на основе информации, предоставленной dn, которая представляет отличительное имя, которое будет использоваться в сертификате.

PHP код для генерации самозаверяющими-сертификат

<?php 
// For SSL certificates, the commonName is usually the domain name of 
// that will be using the certificate, but for S/MIME certificates, 
// the commonName will be the name of the individual who will use the certificate. 
$dn = array(
    "countryName" => "UK", 
    "stateOrProvinceName" => "Somerset", 
    "localityName" => "Glastonbury", 
    "organizationName" => "The Brain Room Limited", 
    "organizationalUnitName" => "PHP Documentation Team", 
    "commonName" => "Wez Furlong", 
    "emailAddress" => "[email protected]" 
); 

// Generate a new private (and public) key pair 
$privkey = openssl_pkey_new(); 

// Generate a certificate signing request 
$csr = openssl_csr_new($dn, $privkey); 

// You will usually want to create a self-signed certificate at this 
// point until your CA fulfills your request. 
// This creates a self-signed cert that is valid for 365 days 
$sscert = openssl_csr_sign($csr, null, $privkey, 365); 

// Now you will want to preserve your private key, CSR and self-signed 
// cert so that they can be installed into your web server. 

openssl_csr_export($csr, $csrout) and var_dump($csrout); 
openssl_x509_export($sscert, $certout) and var_dump($certout); 
openssl_pkey_export($privkey, $pkeyout, "mypassword") and var_dump($pkeyout); 

// Show any errors that occurred here 
while (($e = openssl_error_string()) !== false) { 
    echo $e . "\n"; 
} 
//save certificate and privatekey to file 
file_put_contents("certificate.cer", $certout); 
file_put_contents("privatekey.pem", $pkeyout); 
?> 
Смежные вопросы