jueves, 5 de noviembre de 2009

Instalar Apache2 con SSL en Ubuntu 9.04 (Jaunty)

Esta es una guía para ayudar en la instalación de Apache2 con soporte para SSL en un servidor Ubuntu 9.04 (Jaunty). Esta guía asume que para esto ya se tiene instalado un stack LAMP (Linux, Apache, MySQL y PHP) en la máquina donde se desea realizar la instalación. No será necesario contar con el stack completo sin embargo si es necesario al menos contar con Apache2 instalado en el equipo.

Para verificar que efectivamente contamos con todos los requisitos tecleamos en la terminal:

sudo apt-get install apache2 apache2.2-common apache2-utils openssl openssl-blacklist openssl-blacklist-extra


Para configurar un servidor seguro, se utiliza en este caso criptografía de clave pública para crear un par de llaves, una pública y una privada. En la mayoría de los casos, el certificado que se genera localmente en el equipo tiene que ser enviado junto con varios requisitos a una Autoridad Certificadora (CA por sus siglas en inglés). La CA verifica su petición y su identidad, y luego le devuelve un certificado para asegurar el servidor. En este caso como no tenemos ni el dinero ni el tiempo suficiente (:D) tendremos que crear nuestro propio certificado, firmado por nosotros mismos. Sin embargo, es importante recalcar que estos certificados no deberán ser utilizados en ambientes de producción. El problema con este tipo de certificados es que no son aceptados de manera automática por los navegadores, por lo que tendremos que (al menos en FireFox) crear una excepción para el sitio con el cerficado que estamos creando nosotros. Pero para fines de demostrar los pasos será más que suficiente.

Primero: Generamos un CSR (Petición de Firma de Certificado)

Para generar el CSR debemos crear nuestra llave (key):

openssl genrsa -des3 -out server.key 4096

Puede ejecutar su propio servidor sin una clave. Esto es conveniente proque no necesitaría en este caso estar introduciendo la clave cada que requiera iniciar el servidor de https. Pero es demasiado inseguro, no recomendable ya que compromete seriamente la seguridad del sistema. De cualquier manera, es posible elegir ejecutar el servidor seguro sin clave eliminando la opción -des3 con lo que el comando quedaría de la siguiente manera:

openssl rsa -in server.key -out server.key.insegura

Al ejecutar este comando en cualquiera de sus dos formas presentadas anteriormente el sistema nos requerirá varia información que acompañará al certificado, la ubicación de la companía, el nombre de la misma, el nombre de quien firma el certificado y varias cosas mas. Todos estos datos son guardados en el archivo /etc/ssl/openssl.cnf. Si se requieren mas llaves para mas servidores o sitios que se ejecutarán en el mismo equipo se pueden agregar mendiante:

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

Este certificado (el archivo server.csr en este caso) es el que deberemos enviar a la Autoridad Certificadora (CA).

Una vez que hemos generado nuestro certificado necesitamos instalarlo en el servidor.

Segundo: Crear un Certificado Firmado por nosotros mismos.
Para firmar nuestro certificado de manera local ejecutamos:

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

El comando anterior nos va a requerir que introduzcamos la clave de nuestra llave (si optamos por utilizar una clave segura, de otro modo no solicitará esta información), que es la clave que introdujimos al crear nuestra Petición de Firma de Certificado (CSR). Una vez que hemos ingresado la clave correcta, se generará un cerficiado y se almacenará con el nombre server.crt en nuestro servidor.

Tercero: Instalar el Certificado
Para instalar el certificado vamos a copiar los archivos server.crt y server.key a un directorio donde en adelante podremos almacenar todos los certificados de nuestro equipo.

Vamos a crear un directorio ssl dentro del directorio de configuración de apache y enseguida copiamos los archivos generados:

sudo mkdir /etc/apache2/ssl/
sudo cp server.crt /etc/apache2/ssl/
sudo cp server.key /etc/apache2/ssl/

Cuarto: Habilitar el módulo SSL para Apache2
Ejecutamos el siguiente comando:

sudo a2enmod ssl

Quinto: Crear y habilitar el sitio SSL
Vamos a crear un VirtualHost para nuestro sitio:
sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/www.misitio.com

Luego, editamos el archivo www.misitio.com

sudo gedit /etc/apache2/sites-available/www.misitio.com
Y lo dejamos con el siguiente contenido:


ServerAdmin webmaster@localhost
ServerName www.misitio.com
LogLevel warn
ErrorLog /var/log/apache2/www.misitio.com.error.log
CustomLog /var/log/apache2/www.misitio.com.access.log combined

DocumentRoot /var/www/www.misitio.com/


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


SSLEngine On
SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown


Por último, habilitamos el sitio que acabamos de crear:


sudo a2ensite www.misitio.com

Sexto: Habilitar Apache2 para que escuche en el puerto 443.
Necesitamos editar el archivo ports.conf:


sudo gedit /etc/apache2/ports.conf

Al abrirlo se ve de la siguiente manera:

# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default

NameVirtualHost *:80
Listen 80
# SSL name based virtual hosts are not yet supported, therefore no
# NameVirtualHost statement here
Listen 443

Vamos a agregar el NameVirtualHost al puerto de https (443). Así que al terminar deberá quedar de esta manera :

# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default

NameVirtualHost *:80
Listen 80
# SSL name based virtual hosts are not yet supported, therefore no
NameVirtualHost *:443
Listen 443

No hay que olvidar editar el archivo /etc/hosts si se esta corriendo de manera local el sitio www.misitio.com y apuntarlo a 127.0.0.1

Ahora reiniciamos el servidor:

sudo /etc/init.d/apache2 restart

Si se ha optado por utilizar una llave con clave, el servidor requerirá que tecleemos la contraseña para poder continuar, en caso contrario no arrancará el servicio.

Séptimo: Acceder al servidor.
Ahora es posible acceder al servidor en la dirección https://www.misitio.com. Si se ha utilizado un certificado que nostros mismos hemos firmado, el navegador nos indicará que ha fallado la conexión segura, es cuestión de ignorar simplemente el mensaje y agregar una excepción de seguridad para nuestro sitio.

No hay comentarios: