En esta entrada describiré como se debe montar un servidor web seguro, y la elaboración de su certificado digital.
El servidor a usar será Apache 2. Para el correcto funcionamiento de éste se necesita que cuente con un certificado digital de seguridad. Estos certificados son expedidos por entidades certificadoras, llamadas CA, como Verisign, y en Colombia, Certicámaras. Lo que haría una empresa que quisiera asegurar su servidor es crear una petición de certificado (archivo con extensión.crs) y envariala a una de éstas entidades, las cuales le devolverán el certificado digital que debe instalar en el servidor. Este certificado tiene la extensión .crt.
Lo que voy a hacer para mostar como se debe configurar el servidor, es crear un certificado digital autofirmado para una entidad certificadora ficticia, luego firmar la petición de certificado del servidor y así no tener que pagar por dicho certificado. (OJO: Solo fines académicos)
Utilizaré openssl para hacer los certificados. Así que comencemos:
Paso 1: Instalar openssl
Openssl se puede instalar mediante la instrucción:
—–> aptitude install openssl
Paso 2: Crear directorios
Es recomnedable que creemos directorios para organizar los certificados que generemos y no llegar a confundirnos. Crearé una carpeta en root llamada “Certificados” y dentro de ella dos directorios más, llamados “CA” y “servidor”. Ésto se logra mediante las instrucciones:
—–> mkdir Certificados
—–> cd Certificados
—–> mkdir CA
—–> mkdir servidor
Paso 3: Crear el certificado autofirmado de la entidad certificadora
Para crear el certificado se debe hacer primero la llave privada de la entidad guardándola en la carpeta CA creada anteriormente mediante las instrucciones:
—–> cd Certificados/CA
—–> openssl genrsa -des3 -out ca_sergio.key 1024
Ésto significa que en la carpeta “CA” nos generará un archivo llamado ca_sergio.key que contendrá la llave hecha con los siguientes parámetros:
- algoritmo de cifrado : des3
- tamaño de la llave en bits: 1024
Después tendremos que digitar un password. En este caso será: “entidad”. Éste password es para asegurar la llave privada de la entidad certificadora.
Ahora debemos generar el certificado digital. Este certificado será firmado con la llave obtenida anteriormente:
—–> openssl req -new -x509 -days 365 -key ca_sergio.key -out ca_sergio.crt
Con esta instrucción hemos creado un nuevo certificado para la entidad certificadora llamado ca_sergio.crt y firmado con la llave que creamos anteriormente ca_sergio-key
Otros parámetros importantes de la instrucción son:
- estándar del certificado: x509
- Vigencia del certificado: 365 dias
Ahora se nos pedirá el password que le pusimos a la llave, y luego tendremos que completar la información del certificado como se muestra a continuación:
- Country Name (2 letter code) [AU]:CO
- State or Province Name (full name) [Some-State]:Antioquia
- Locality Name (eg, city) []:Medellin
- Organization Name (eg, company) [Internet Widgits Pty Ltd]:OREX
- Organizational Unit Name (eg, section) []:Unidad de Certificación
- Common Name (eg, YOUR name) []:www.orex.com.co
- Email Address []:info@orex.com.co
Con esto ha quedado listo el certificado autofirmado de la entidad certificadora.
Paso 3: Crear el certificado para el servidor web
Ahora se debe crear el certificado para el servidor web, pero primero necesitamos su llave privada :
Nos debemos ubicar en la carpeta servidor:
—–> cd Certificados/servidor
Luego digitamos:
—–> openssl genrsa -des3 -out srv_sergio.key 1024
Con esto hemos creado un archivo de lave llamado srv_sergio.key donde:
- El algoritmo de encripción es des3
- Tamaño de la llave en bits:1024
Luego se debe crear la petición de certificado digital del servidor web, eso se logra mediante el comando:
—–> openssl req -new -key srv_sergio.key -out srv_sergio.crs
También nos pide un password para proteger la llave privada del servidor. En este caso ingresé “servidor”.
Debemos introducir la información de la petición de certificado digital como:
- Country Name (2 letter code) [AU]:CO
- State or Province Name (full name) [Some-State]:Antioquia
- Locality Name (eg, city) []:Medellín
- Organization Name (eg, company) [Internet Widgits Pty Ltd]:Velasquez s.a.
- Organizational Unit Name (eg, section) []: Departamento de Certificación
- Common Name (eg, YOUR name) []:velasquez.seguridad.net
- Email Address []:sergio@velasquez.seguridad.net
- Please enter the following ‘extra’ attributes to be sent with your certificate request
- A challenge password []:
- An optional company name []:
Una vez que tenemos la petición anterior podemos generar, con el certificado autofimado de la CA, el certificado del servidor:
—–> openssl x509 -req -in srv_sergio.crs -out srv_sergio.crt -sha1 -CA ../CA/ca_sergio.crt -CAkey ../CA/ca_sergio.key -CAcreateserial -days 365
Los valores especificados en dicha instrucción corresponden a:
- Petición de certificado del servidor: -req -in srv_sergio.crs
- Algoritmo hash: sha1
- Certificado de la CA: CA ../CA/ca_sergio.crt
- Llave privada de la CA: CAkey ../CA/ca_sergio.key
- Vigencia del certificado: 365 días
Luego saldrá en la consola una confirmación y la información que contiene el certificado:
Signature ok
subject=/C=CO/ST=Antioquia/L=Medellin/O=Velasquez s.a./OU=Departamento de Certificación/CN=velasquez.seguridad.net/emailAddress=sergio@velasquez.seguridad.net
Debemos ingresar la contraseña de la llave privada de la entidad (“entidad”), y con ésto hemos completado la generación del certificado srv_sergio.crt.

Paso 4: Instalación y configuración del servidor
El servidor a usar será Apache 2. La forma de instalarlo es:
—–> aptitude install apache2
Se debe crear una carpeta llamada ssl en /etc/apache2/ y allí copiar los archivos srv_sergio.crt y srv_sergio.key creadas anteriormente.
En esa misma carpeta se debe generar una archivo nombrado “nombredelservidor.pem”, es decir velasquez.seguridad.net.pem.
Éste archivo contiene la llave y el certificado que pusimos en la carpeta. El comando para hacer esto es cat, y la instrucción completa sería:
—–> cat srv_sergio.key srv_sergio.crt >velasquez.seguridad.net.pem
A dicho archivo se le deben adicionar 3 líneas muy importantes para crear la llave sin password, pues sería muy molesto que cada que el
servidor Apache inicie se pida la llave. Dichas líneas son:
—–> cp srv_sergio.key srv_sergio.bak
—–> cp velasquez.seguridad.net.pem velasquez.seguridad.net.pem.bak
—–> openssl rsa -in srv_sergio.key -out no.pwd.srv_sergio.key
Nótese que el archivo con nombre “no.pwd.srv_sergio.key” se convertirá en la llave sin password que usará el servidor.
Se requiere crear un archivo nombrado como nombredominio.pem con la llave que no requiere password:
—–> cat no.pwd.srv_sergio.key srv_sergio.crt >velasquez.seguridad.net.pem
El servidor Apache 2 buscará el certificado y la llave en el archivo que acabamos de crear y no pedirá la clave cada que se inicie.
Paso 5: Configuración del sitio ssl
Ahora se debe configurar el sitio ssl, para ello necesitamos habilitar el módulo ssl del apache:
—–> a2enmod ssl
y aparecerá un mensaje que dice:
—–> Module ssl installed; run /etc/init.d/apache2 force-reload to enable.
Ahora debemos buscar un archivo llamado “default” en la carpeta etc/apache2/sites-available/. Este archivo es un modelo de como se debe configurar el sitio ssl. Para no ir a destruirlo creamos una copia y la pegamos en el mismo lugar pero le cambiamos el nombre a velasquez.seguridad.net:
—–> cp /etc/apache2/sites-available/default /etc/apache2/sites-available/velasquez.seguridad.net
En dicho archivo modificamos las líneas:
NameVirtualHost velasquez.seguridad.net:443
<VirtualHost velasquez.seguridad.net:443> Este es el dominio del sitio y el puerto https
ServerAdmin sergio@velasquez.seguridad.net Es el administrador del dominio.
Y añadimos las líneas:
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/velasquez.seguridad.net.pem

Se debe habilitar el sitio en la carpeta “etc/apache2/sites-enabled/” mediante el comando:
—–> a2ensite velasquez.seguridad.net
Paso 6: Pruebas
Para poder probar el servidor debemos asociar nuestro dominio con la dirección loopback 127.0.0.1, así que en el archivo /etc/hosts se debe agregar la línea:
127.0.0.1 velasquez.seguridad.net
se debe reiniciar el servidor:
—–> /etc/init.d/apache2 restart

En un browser como Mozilla entramos a la página que corresponde a nuestro dominio:
https://velasquez.seguridad.net
Aparece una ventana de error indicando que la conexión segura falló, pues el certificado está firmado por una entidad certificadora no reconocida.

Entonces debemos instalar ese certificado. Se debe dar click en agregar excepción.

Luego aparecerá una ventana preguntándonos si deseamos confirmar la excepción.

¿Cómo veo el certificado digital?
En esta misma ventana damos click en el botón ver, y aparece la información del certificado.

Si nos pasamos a la pestaña de detalles podemos ver la información detallada del issuer y del subject dando click en esos campos:


Una vez la confirmemos, el certificado quedará instalado y no saldrá nunca más saldrá la ventana de error inicial y se puede ver la página principal del servidor. Aparece un candado en la parte inferior que significa que se ha establecido una conexión segura.

Así se logra que el servidor web este seguro y la trasmisión de datos sea cifrada.