2009-10-13

Paginas https con Certificados Propios

Debido a mi trabajo aprendí como crear los certificados SSL para las paginas https, esto lo hice siguiendo este buen manual sobre CentOS (distribución basada en redhat, muy buena para servidores). Obviamente como la explicación esta echa para este sabor tube que realizar ciertas pero diminutas variaciones, así que pues empecemos eso advierto es largo, un poco tedioso y sobre todo de mucho cuidado de lo que se esta haciendo, lo primero es saber si tienes el openssl actualizado e instalado, el cual se prueba así

root@localhost:~# openssl version
OpenSSL 0.9.8g 19 Oct 2007

Una vez echo esto crearemos los directorios donde guardaremos los datos del certificado, por defecto estos directorios se guardan con el nombre de CA pero la verdad puedes usar el nombre que desees, ya entenderas porque, ara nuestro ejemplo todo lo crearemos sobre el directorio de /etc/ssl/, pues me pareceque es el lugar mas apropiado para guardar el orden pero lo puedes colcoar donde quieras siempre y cuando sepas donde esta, entonces creas los 3 diretorios que necesitas así

root@localhost:/etc/ssl# mkdir CA
root@localhost:/etc/ssl# mkdir CA/certificados
root@localhost:/etc/ssl# mkdir CA/privado

sobre este mismo directorio se deben crear dos archivos que se usan en la base de datos para la creación de llaves, estos se crean así

root@localhost:CA# echo 01 > serial
root@localhost:CA# touch index.txt

Bueno ya tenemos los prerequisitos listos, entonces ahora toca cuadrar los parámetros de openssl.cnf, estos son docenas de parámetros pero pues no todos son completamente necesarios o mas bien para nuestro caso útiles, acá les muestros los parámetros que modifique y les muestro como los deje

dir = /etc/ssl/CA # ubicación del directorio
certs = $dir/certificados # donde se guardaran los certificados

crl_dir = $dir/privado # donde se guardan los crl
database = $dir/index.txt # Archivo index de la base de datos

countryName_default = CO # Id por defecto del país mi caso Colombia

stateOrProvinceName_default = Bogota DC # Nombre de la ciudad

localityName_default = Bogota # Nombre por defecto de la localidad

0.organizationName_default = Diego Samuel Ltd # Nombre por defecto de la organización

emailAddress_default = diego@samuel.com # Correo de contacto por defecto


Bueno iniciaremos con el proceso de la creación del certificado raiz, el cual nos permitira la autoridad para firmar los certificados CA que crearemos, para esto se tiene que tener en ceunta que lo primero que se solicitara es el passphrase o frase de contraseña, la cual debe ser bastante compleja, de mas de 10 caracteres con mayusculas, minusculas, numeros, simbolos y espacios, como ejemplo yo usare la siguiente

E1 fu7uR0 d31 Pl4net4 3$ta en TI

Bueno ahora ya con eso en la cabeza y claro que es la que vas a tener que saber y aprender, enviamos el comando para crear el certificado de la siguiente forma

root@localhost:/etc/ssl/CA# openssl req -x509 -newkey rsa:2048 -keyout privado/cakey.pem -out cacert.pem -days 3650 -config /etc/ssl/openssl.cnf

Esto nos generara la siguiente salida que si se fijan es lo que habíamos configurado

Generating a 1024 bit RSA private key
..............++++++ ......................++++++
writing new private key to 'privado/cakey.pem'

Enter PEM pass phrase:

Verifying - Enter PEM pass phrase:
----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. -----
Country Name (2 letter code) [CO]:
State or Province Name (full name) [Bogota DC]:
Locality Name (eg, city) [Bogota]:

Organization Name (eg, company) [Diego Samuel Ltd]:

Organizational Unit Name (eg, section) []:infraestructura
Common Name (eg, YOUR name) []:server.diegosamuel.com
Email Address [diego@samuel.com]


Ahora entenderemos lo que se hizo en el comando, por que la intensión es aprender no copiar, los parámetros de comando son los siguientes

req -new x509 = Administrador de requerimientos de firma para certificados x509, en este caso es un certificado autofirmado

keyout = Ubicación y nombre donde quedara la llave privada, por defecto se usa cakey.pem, pero en realidad puedes usar cualquier nombre siempre y cuando te acuerdes de cambiarlo en el openssl.cnf

out = Ubicación y nombre donde quedara el certificado ra, por defecto se usa cacert.pem, pero en realidad puedes usar cualquier nombre siempre y cuando te acuerdes de cambiarlo en el openssl.cnf

days = Número de días valido de la llave, para el caso 10 años

config = Ubicación del archivo de configuración a usar


Bueno ahora vamos a crear la llave privada, una solicitud de certificado y auto firmar dicha solicitud, todo esto lo hacemos en Linux con un comando el cual es el siguiente

root@localhost:/etc/ssl# openssl genrsa -des3 -out diegocert.pem -config /etc/ssl/openssl.cnf -passout pass:E1\ fu7uR0\ d31\ Pl4net4\ 3$ta\ en\ TI

Lo cual te genera lo siguiente como respuesta

Generating a 1024 bit RSA private key
.............++++++ ...............++++++ writing new private key to 'privkey.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [CO]:
State or Province Name (full name) [Bogota DC]:
Locality Name (eg, city) [Bogota]:

Organization Name (eg, company) [Diego Samuel Ltd]:

Organizational Unit Name (eg, section) []:infraestructura
Common Name (eg, YOUR name) []:server.diegosamuel.com
Email Address [diego@samuel.com]


Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:

En el Common Name que se pregunta se debe colocar el FQDN o nombre de la maquina propiamente, en este caso que es inventado se coloco www.diegosamuel.com pero debes colocar el nombre de la maquina donde va a quedar este certificado, este proceso nos genera archivos el requerimiento de firma del certificado y la llave privada, que son los respectivamente diegocert.pem y privkey.pem, los nombres pueden variar pero tiene que tener en cuenta como los colocaron siempre para cambiar los archivos de configuración.

Bueno en este momento tenemos que hacer el requerimiento del certificado para que sea firmado por la autoridad certificadora que para el caso seremos nosotros mismos, por lo cual procederemos a realizar a continuación con un comando

root@localhost:/etc/ssl# openssl req -new -subj"/DC=diegosamuel.com/OU=com/CN=diegosamuel" -key diegocert.pem -passin pass:E1\ fu7uR0\ d31\ Pl4net4\ 3$ta\ en\ TI -out pet-cert-diego.pem -config /etc/ssl/openssl.cnf

Los parámetros que usamos en este comando sirven cada uno para lo siguiente

req -new = Indicamos que es una petición nueva y con parámetros

subj = Nos permite indicar a quien le pertenece el certificado, por eso se usan las comillas y los separadores /, donde se debn usar los datos de cada uno de ustedes

key = Indica la llave privada que usaremos

passin = La contraseña de la llave

out = Donde quedara guardada la petición


Bueno ya podemos emitir el certificado, para esto vamos a hacer una modificación mas en el archivo de configuración de openssl.cnf , que se encuentra en /etc/ssl y con un editor (vi usualmente), buscamos estas lineas y las dejamos así

basicConstraints = critical,CA:FALSE
extendedKeyUsage = serverAuth

Listo ahora si hacemos el certificado con el siguiente comando

root@localhost:/etc/ssl/CA# openssl x509 -CA cacert.pem -CAkey key.pem -req -in pet-cert-diego.pem -config /etc/ssl/openssl.cnf -days 3650 -sha1 -CAcreateserial -out certdiegosa.pem

Los parámetros son los mismos que anteriormente hemos visto y usado, el unico diferente es sha1, ya que este es el algoritmo de cifrado que usaremos, podemos usar sha 128 pero ya es mucho con sha1 es suficiente.

Bueno de todos los archivos creados tenemos que pasar los dos archivos que realmenten nos interesan a un directorio mas apropiado así

root@localhost:/etc/ssl/CA# cp -a certdiegosa.pem /etc/apache2/ssl
root@localhost:/etc/ssl/CA# cp -a diegocert.pem /etc/apache2/ssl

Y tenemos los certificados listos, ahora la configuración del apache para que sean usados correctamente, se deben adicionar las siguientes lineas en el ports.conf

listen 80
listen 443

Y en la configuración del VirtualHost sería así


DocumentRoot /var/www/diegosamuel
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/certdiegosa.pem
SSLCertificateKeyFile /etc/apache2/ssl/diegocert.pem
ServerName www.diegosamuel.com

Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all



Bueno queda reiniciar el servicio y acá se presentara un pequeño inconveniente el cual resolvemos de una forma algo machetera, pero que te evitara problemas cuando se te reinicie la maquina y no estes hay para colocar la contraseña que te pide, entonces en /etc/sites-avaliables/default, y fuera de cualquier vitualhost colocas la siguiente línea

SSLPassPhraseDialog exec:/etc/apache2/clave

y ahora creamos ese "script" para que incerte la contraseña de la siguiente forma

root@localhost:~# vi /etc/apache2/clave

#!/bin/bash
echo
"E1 fu7uR0 d31 Pl4net4 3$ta en TI"


Y le damos permisos de ejecución para el propietario y solo para el propietario así

root@localhost:~# chmod 700 /etc/apache2/clave

Bueno listo con este tenemos el https listo con nuestro propio certificado