12 de octubre de 2009

Certificados con OpenSSL


¿Qué es?

Es un documento digital mediante el cual un tercero (AC [Autoridad Certificadora, por ejemplo Verisign]) garantiza la vinculación entre la identidad de un ente y su llave pública.

Si citamos un ejemplo de la vida real, podemos tomar el del "certificado de estudios", en el que un tercero (SEP), garantiza que cierta persona ha cubierto cierto nivel de estudios.



Otro ejemplo sería la credencial de elector, el IFE es el tercero que garantiza la identidad (entre otras cosas) de la persona a la cual se la expidió.


¿Cómo se hace?


Un certificado principalmente se compone de 3 partes:

1.- Llave privada
2.- CSR (Certificate Sign Request - Requerimiento de Firma de Certificado)
3.- CRT (Certificado como tal)

Cabe recalcar que el paso número 3, corre a cuenta de la AC (Autoridad Certificadora), aunque también podemos hacer un certificado "autofirmado"; es decir, que acudimos con un tercero para la certificación, sino que lo hacemos nosotros mismos.

Para efectos de éste artículo, se realizará un certificado con OpenSSl para apache.

A continuación escribiremos los comandos necesarios para la generación del certificado, tomando en cuenta que el dominio para el cual generaremos el certificado es: www.seguridad.com

1.- Llave privada

Teclear en la cosola de Linux/Unix:

a.- Generar archivos con datos aleatorios

$ cat /dev/urandom > rand1.dat
$ cat /dev/urandom > rand2.dat
$ cat /dev/urandom > rand3.dat

b.- Generar llave privada

$ openssl genrsa –rand rand1.dat:rand2.dat:rand3.dat \
-out www.seguridadhost.com.key

genrsa algoritmo para generar la llave







-rand datos aleatorios (generados en el punto a)







-outarchivo de salida que guardará la llave









2.- CSR (Certificate Sign Request - Requerimiento de Firma de Certificado)

$ openssl req –new –key www.seguridadhost.com.key \
-out www.seguridad.com.csr

req Solicitud de requerimiento







-new Nuevo ¬¬







-inarchivo de entrada de la llave (generado en el punto 1)







-outarchivo de salida del request del certificado








3.- CRT (Certificado como tal)

Si el certificado no es autofirmado se recurre a la AC (Autoridad Certificadora), por ejemplo Verisign para generar el certificado.

Si el certificado es autofirmado, hacemos lo siguiente:

$ openssl x509 –req –days 365 \
–in www.seguridadhost.com.csr
-signkey www.seguridadhost.com.key \
-out www.seguridadhost.com.crt

x509 Algoritmo para generar el certificado







-req requerimiento de certificado







-days Periodo de validez del certificado







-inarchivo de entrada del csr (generado en el punto 2)







-signarchivo de entrada de la llave (generado en el punto 1)







-outarchivo de salida del certificado








¿Cómo se instala?

Como es un certificado, debe ser instalado bajo el protocolo 443 (https). Para ello tenemos que hacer los siguientes pasos:

1.- Descomentar la línea que tenga el módulo de ssl en el archivo httpd.conf, sino existiera esta línea seguramente es porque no está instalado el módulo ssl.

LoadModule ssl_module lib/httpd/modules/mod_ssl.so

(Dependiendo del sistema operativo, la ruta del mod_ssl.so podría cambiar)

2.- En el archivo httpd.conf, hacer la referencia hacia el archivo que contendrá el hostvirtual de ssl.

En el httpd.conf existe una línea como esta:

#Include /etc/httpd/extra/httpd-ssl.conf

Aquí hay 2 opciones, descomentar esta línea y posteriormente editar el archivo httpd-ssl.conf (paso número 3).

3.- Editar el archivo /etc/httpd/extra/httpd-ssl.conf

Un ejemplo de lo que deberá contener el archivo para la edición del host virtual:

<VirtualHost *:443>
ServerAdmin hostmaster@seguridadhost.com
DocumentRoot /var/www/htdocs/vhost/www.seguridadhost.com
ServerName www.seguridadhost.com
ErrorLog /var/log/httpd/error_log
CustomLog /var/log/httpd/log common
SSLEngine on
SSLCertificateFile /etc/ssl/certs/www.seguridadhost.com.crt
SSLCertificateKeyFile /etc/ssl/certs/www.seguridadhost.com.key
<Directory /var/www/htdocs/vhost/www.seguridadhost.com>
Options ExecCGI FollowSymLinks
AddHandler cgi-script .cgi
AllowOverride all
Allow from all
Order allow,deny
</Directory>
</VirtualHost>

Las 3 líneas importantes que se tienen que considerar con las que están en negritas:

<VirtualHost *:443>
Se define el host virtual

SSLCertificateFile /etc/ssl/certs/www.seguridadhost.com.crt
Se hace la referencia del certificado creado

SSLCertificateKeyFile /etc/ssl/certs/www.seguridadhost.com.key
Se hace la referencia de la llave creada


4.- Por último se tendrá que reiniciar el servicio de apache.


apachectl stop
apachectl start-ssl

Cabe aclarar que en algunas distribuciones start-ssl es igual a start

2 comentarios: