2012-03-05 5 views
14

Voglio creare un certificato autofirmato in PHP 5.x. con la mia configurazione (alternativa) openssl che dovrebbe essere definita dal mio codice PHP. Lo script PHP verrà eseguito su ambienti diversi (server di hosting condiviso).OpenSSL ha davvero bisogno di un percorso per openssl.conf?

Il funzionario PHP Manual dice:

Per impostazione predefinita, le informazioni nel openssl.conf sistema viene utilizzato per inizializzare la richiesta; è possibile specificare una sezione del file di configurazione impostando la chiave config_section_section di configargs. È inoltre possibile specificare un file di configurazione openssl alternativo impostando il valore della chiave di configurazione sul percorso del file che si desidera utilizzare. I seguenti tasti, se presenti in configargs comportarsi come i loro equivalenti nel openssl.conf, come indicato nella tabella qui sotto .....

La mia domanda: C'è un motivo per cui devo specificare il percorso a openssl.conf esplicitamente, perché sembra funzionare bene senza di essa:

$Configs = array(  
    'digest_alg' => 'sha1', 
    'x509_extensions' => 'v3_ca', 
    'req_extensions' => 'v3_req', 
    'private_key_bits' => 1024, 
    'private_key_type' => OPENSSL_KEYTYPE_RSA, 
    'encrypt_key' => true, 
    'encrypt_key_cipher' => OPENSSL_CIPHER_3DES 
); 

$privkey = openssl_pkey_new(); 
$csr = openssl_csr_new($dn, $privkey, $Configs); 
$sscert = openssl_csr_sign($csr, null, $privkey, 365, $Configs); 

Modifica:

Nel note di utenti sul PHP Manual, perché hanno sempre specificare il percorso di openssl.cnf ? Per esempio:

$configargs = array(
    'config' => '/etc/ssl/openssl.cnf', 
    'digest_alg' => 'md5', 
    'x509_extensions' => 'v3_ca', 
    'req_extensions' => 'v3_req', 
    'private_key_bits' => 666, 
    'private_key_type' => OPENSSL_KEYTYPE_RSA, 
    'encrypt_key' => false, 
); 
+1

Il file .conf viene utilizzato per specificare le impostazioni predefinite, in modo da non dover inserire la stessa cosa più e per ogni certificato che crei. Andare senza le impostazioni predefinite va bene, solo più noioso. –

+3

Non sono un esperto di PHP/OpenSSL, ma sembra che alcune impostazioni di configurazione non possano essere definite/modificate da uno script PHP. Qualcuno può confermare/respingere questo? – Mike

risposta

10

Ci sono molte impostazioni di configurazione in OpenSSL che non possono essere definiti in PHP da $ configargs (i parametri PHP si passa alle funzioni OpenSSL).

Se non si specifica un file di configurazione OpenSSL alternativa, ci vorrà automaticamente l'openssl.cnf di default.

Raccomandazione: Dal momento che lo script verrà eseguito su server diversi, si dovrebbe sempre utilizzare il proprio openssl.cnf.

basta creare un file di testo semplice e mettere i seguenti 4 linee in esso. Quindi passa il percorso ad esso nella funzione OpenSSL che stai utilizzando (guarda il tuo secondo esempio sopra).

distinguished_name = req_distinguished_name 
[req_distinguished_name] 
[v3_req] 
[v3_ca] 

Sembra che queste 4 righe sono il minimo openssl.cnf deve contenere.

6

La risposta a questo si riferisce al ruolo di SSL. È una "shell" attorno alla conversazione html/http tra client e server. Apache lo esegue. Non è davvero "in" la terra di PHP. Quando decidi di ricreare la coppia di chiavi, tutto ciò che stai facendo è dare un calcio a Apache negli stin per costringere il client/server a riavviare la conversazione con una nuova coppia di coppie di chiavi SSL.

In un certo senso questo potrebbe essere visto come un po 'come rifare

La mia domanda un session_id: C'è un motivo per cui devo specificare il percorso openssl.conf esplicitamente, perché sembra funzionare bene senza di esso:

La creazione di un certificato autofirmato non viene eseguita qui, è una sua ri-creazione. quindi quando non si fornisce un percorso, va bene perché ha già un percorso da Apache.

+2

Cosa succede se si specifica un file di configurazione che non contiene tutti i valori di configurazione: prende il valore predefinito dal file di configurazione predefinito? – HomeCoder

+0

Abbastanza onestamente, non sono sicuro di come questo avrebbe effetto sul PHP OpenSSL, in teoria sarebbe impossibile ereditare correttamente tali proprietà. Ma PHP potrebbe essere abbastanza intelligente. Tuttavia, vorrei evitarlo e rispettare i tuoi parametri: potresti facilmente finire con un avviso di certificato invaild nel browser – conners

2

Creazione di un CERT auto-firmato in PHP senza OpenSSL (richiede phpseclib, a pure PHP X.509 implementation) ...

<?php 
include('File/X509.php'); 
include('Crypt/RSA.php'); 

// create private key/x.509 cert for stunnel/website 
$privKey = new Crypt_RSA(); 
extract($privKey->createKey()); 
$privKey->loadKey($privatekey); 

$pubKey = new Crypt_RSA(); 
$pubKey->loadKey($publickey); 
$pubKey->setPublicKey(); 

$subject = new File_X509(); 
$subject->setPublicKey($pubKey); 
$subject->setDNProp('id-at-organizationName', 'phpseclib demo cert'); 
$subject->setDomain('www.whatever.com'); 

$issuer = new File_X509(); 
$issuer->setPrivateKey($privKey); 
$issuer->setDN($subject->getDN()); 

$x509 = new File_X509(); 
$x509->setStartDate('-1 month'); 
$x509->setEndDate('+1 year'); 
$x509->setSerialNumber(chr(30)); 

$result = $x509->sign($issuer, $subject); 
echo "the stunnel.pem contents are as follows:\r\n\r\n"; 
echo $privKey->getPrivateKey(); 
echo "\r\n"; 
echo $x509->saveX509($result); 
echo "\r\n";