2012-03-05 46 views
14

Quiero crear un certificado autofirmado en PHP 5.x. con mi propia configuración openssl (alternativa) que debería ser definida por mi código PHP. El script PHP se ejecutará en diferentes entornos (servidores web de alojamiento compartido).¿OpenSSL realmente necesita una ruta a openssl.conf?

El funcionario PHP Manual dice:

Por defecto, la información en su openssl.conf sistema se utiliza para inicializar la solicitud; puede especificar una sección de archivo de configuración configurando la clave config_section_section de configargs. También puede especificar un archivo de configuración de openssl alternativo estableciendo el valor de la clave de configuración en la ruta del archivo que desea usar. Las siguientes teclas, si está presente en configargs se comportan como sus equivalentes en el openssl.conf, que se enumeran en la tabla de abajo .....

Mi pregunta: ¿Existe una razón por la que tengo que especificar la ruta a openssl.conf de forma explícita, ya que parece funcionar bien sin él:

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

Editar:

en el notas de usuarios en el PHP Manual, ¿por qué siempre tienen que especificar una ruta a openssl.cnf ? Por ejemplo:

$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

El archivo .conf se utiliza para especificar valores por defecto, por lo que no tiene que introducir la misma cosa una y más por cada cert que crees Ir sin los valores por defecto está bien, simplemente es más tedioso. –

+3

No soy un experto en PHP/OpenSSL, pero parece que algunas configuraciones no pueden ser definidas/modificadas por un script PHP. ¿Alguien puede confirmar/descartar esto? – Mike

Respuesta

10

Hay muchos ajustes de configuración en OpenSSL que no se pueden definir en PHP por $ configargs (los parámetros de PHP que pasan a las funciones de OpenSSL).

Si no especifica un archivo de configuración de openssl alternativo, tomará automáticamente el valor predeterminado de openssl.cnf.

Recomendación: Como su script se ejecutará en servidores diferentes, siempre debe usar su propio openssl.cnf.

Simplemente cree un archivo de texto simple y coloque las siguientes 4 líneas en él. Luego, transmita la ruta a la función OpenSSL que está utilizando (consulte su segundo ejemplo anterior).

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

Parece que estas 4 líneas son lo mínimo que debe contener openssl.cnf.

6

La respuesta a esto se relaciona con el papel de SSL. Es un "shell" alrededor de la conversación html/http entre el cliente y el servidor. Apache lo ejecuta. No es realmente "en" tierra de PHP. Cuando eliges recrear el par de claves, lo único que estás haciendo es patear a Apache en las espinillas para forzar al cliente/servidor a reiniciar su conversación con un nuevo par de pares de claves SSL.

En algunos sentidos esto podría ser visto como un poco como rehacer

Mi pregunta un session_id: ¿Hay una razón por la que tengo que especificar la ruta al openssl.conf explícitamente, ya que parece funcionar bien sin él:

Aquí no se realiza la creación de un certificado autofirmado, sino una recreación del mismo. por lo tanto, cuando no proporciona una ruta, está bien porque ya tiene una ruta desde Apache.

+2

¿Qué ocurre si especifico un archivo de configuración que no contiene todos los valores de configuración? ¿Toma el valor predeterminado del archivo de configuración predeterminado? – HomeCoder

+0

Honestamente, no estoy seguro de cómo esto afectaría a PHP OpenSSL, en teoría sería imposible heredar correctamente esas propiedades. Pero PHP podría ser lo suficientemente inteligente. Sin embargo, me abstendría de cumplir con sus propios parámetros: podría terminar fácilmente con una advertencia de certificado invadido en el navegador – conners

2

Creación de un certificado autofirmado en PHP sin OpenSSL (requiere 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"; 
Cuestiones relacionadas