Cómo crear un certificado SSL auto-firmado

Todos sabemos que, en una comunicación SSL cifrada, el certificado firmado por una Entidad Certificadora Autorizada (CA) nos asegura que el otro extremo es realmente quien dice ser. No obstante, muchas veces nos interesa generar un certificado auto-firmado para pruebas o uso interno. 

Con openssl y un Unix/Linux es realmente fácil y, aunque existe muchísima documentación al respecto, siempre viene bien tener a mano una pequeña guía. A propósito de una reciente entrada de Akadia podemos ver cómo hacerlo paso a paso:

Paso 1: Generar una Clave Privada

El kit de herramientas de OpenSSL se utiliza para generar una clave RSA privada y un CSR (solicitud de firma de certificado). Pero, como comentamos, también se puede utilizar para generar certificados auto-firmados que pueden ser utilizados para propósitos de prueba o de uso interno.

El primer paso es crear tu clave privada RSA. Esta clave es una clave de 1024 bits RSA que se cifra usando Triple-DES y se almacena en formato PEM de modo que sea legible como texto ASCII.


openssl genrsa -des3 -out server.key 1024

Generating RSA private key, 1024 bit long modulus
.........................................................++++++
........++++++
e is 65537 (0x10001)
Enter PEM pass phrase:
Verifying password - Enter PEM pass phrase:

Paso 2: Generar un CSR (solicitud de firma de certificado)

Una vez que hemos creado la clave privada, se puede generar una solicitud de firma de certificado. El CSR se puede utilizar entonces de dos maneras. Idealmente, el CSR se enviará a una autoridad de certificación, tal como Thawte o Verisign, quien verificará la identidad del solicitante y expedirá un certificado firmado. La segunda opción es la de auto-firmar el CSR, que se demostrará a continuación.

Durante la generación del CSR, se pedirá varia información. Estos son los atributos X.509 del certificado. Uno de los mensajes nos pedirá el Common Name. Es importante que este campo se rellene con el nombre de dominio completo del servidor que va a estar protegido por SSL. Es decir, si el sitio web será https://publico.prueba.com, introduce publico.prueba.com. El comando para generar el CSR es el siguiente:


openssl req -new -key server.key -out server.csr

Country Name (2 letter code) [GB]
:SP
State or Province Name (full name) [Berkshire]
:Madrid
Locality Name (eg, city) [Newbury]
:Madrid
Organization Name (eg, company) [My Company Ltd]
:Hackplayers
Organizational Unit Name (eg, section) []
:Information Technology
Common Name (eg, your name or your server's hostname) []
:publico.prueba.com
Email Address []
:hackplayers at ymail dot com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Paso 3: Borrar la contraseña de la clave

Un desafortunado efecto secundario de la transmisión de una clave privada con contraseña (passphrase) es que Apache o el servidor web en cuestión te pedirá la frase de paso cada vez que se inicie el servidor web. Obviamente, esto no siempre es conveniente, sobretodo si el servidor se reinicia automáticamente. mod_ssl incluye la capacidad de utilizar un programa externo en lugar de escribir la frase a mano, sin embargo, esto no es necesariamente la opción más segura tampoco. Es posible eliminar el cifrado triple-DES de la clave para que no sea necesario escribir una clave. Eso sí, si la clave privada ha dejado de estar cifradas, ¡es fundamental que este archivo sólo pueda ser leído por el usuario root!. Si un tercero obtuviera la clave privada sin cifrar, el certificado correspondiente deberá ser revocado. Para quitar la frase de paso de la clave, utiliza el siguiente comando:
 

cp server.key server.key.org
openssl rsa -in server.key.org -out server.key

 
El nuevo fichero creado server.keyya no tiene contraseña. 

-rw-r--r-- 1 root root 745 Jun 29 12:19 server.csr
-rw-r--r-- 1 root root 891 Jun 29 13:22 server.key
-rw-r--r-- 1 root root 963 Jun 29 13:22 server.key.org
 
Paso 4: Crear un certificado auto-firmado

En este punto ya podemos generar el certificado auto-firmado. Hay que decir que, evidentemente, este certificado generará un error en el navegador del cliente en el sentido de que la autoridad de certificado de firma es desconocida y no confiable.

Para generar un certificado válido para 365 días, ejecutaremos el siguiente comando:


openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=/C=SP/ST=Madrid/L=Madrid/O=Hackplayers/OU=Information
Technology/CN=publico.prueba.com/Email=hackplayers at ymail dot com
Getting Private key

Paso 5: Instalar la clave privada y el certificado en Apache

Cuando se instala Apache con mod_ssl, se crean varios subdirectorios en el directorio de configuración de Apache. La ubicación de este directorio será diferente en función de cómo se compiló Apache.


cp server.crt /usr/local/apache/conf/ssl.crt
cp server.key /usr/local/apache/conf/ssl.key

 
Paso 6: Configurar host virtuales con SSL activado

 

SSLEngine on
SSLCertificateFile /usr/local/apache/conf/ssl.crt/server.crt
SSLCertificateKeyFile /usr/local/apache/conf/ssl.key/server.key
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
CustomLog logs/ssl_request_log \
   "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"


Paso 7: Reiniciar Apache y probar
 

/etc/init.d/httpd stop
/etc/init.d/httpd start
 https://publico.hackplayers.com

Comentarios

  1. Si quitas el parámetro -des3 (encriptar con contraseña) al crear el key te ahorras tener que quitarla luego.

    ResponderEliminar
  2. Muy bueno el tutorial, es cierto lo que dice Danky, ahora al contrario como le haces para ponerle contraseña a la llave privada cuando no la tiene? claro, sin generarla de nuevo.
    saludos

    ResponderEliminar
  3. Que tal, intente seguir el tutorial pero si incluyo estas lineas
    SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
    CustomLog logs/ssl_request_log \
    "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
    el servidor ya no se levanta... si ls quito funciona pero sigue sin activarse el https, alguien podria ayudarme

    ResponderEliminar
  4. yo no solo quiero el certificado para una sola pagina sino para todo el trafico de red,
    como puedo hacer eso?

    ResponderEliminar
    Respuestas
    1. si te refieres a usar cifrado SSL a múltiples dominios e ilimitados subdominios con un único certificado echa un vistazo a multidominio wildcard ...

      Eliminar
  5. ¿Como puedo crear un certificado de usuario para la web?

    ResponderEliminar
  6. /etc/init.d/httpd stop
    /etc/init.d/httpd stop

    Error de dedo.

    PD: Muy genial este sitio.

    ResponderEliminar
  7. como puedo agregar informacion al certificado?
    abajo de donde dice:
    este certificado esta destinado al los siguientes propositos

    ResponderEliminar
  8. Buen día tengo la siguiente duda, quiero crear un Certificado Autofirmado para lo cual utilizo la siguiente linea y todo va eprfecto, pero me gustaría saber como puedo hacer para que el certificado además de estar auto firmado tenga contraseña, les dejo los comandos que utilice, espero pueden ayudarme.

    "openssl req -nodes -x509 -newkey rsa:2048 -days 3650 -keyout .key -out .crt"

    ResponderEliminar
  9. Saben como genero una firma digital?

    ResponderEliminar

Publicar un comentario