Skip to main content

Cifrado SSL con Apache2 en Debian

Instalar el servidor Apache2 en Debian no es una tarea complicada sin duda, pero el ir puliendo algunos detalles para tener un mejor performance, seguridad y estabilidad en general, a veces lo es.

Supongamos que deseamos agregar un nuevo sitio pero que la comunicación entre el cliente y el servidor sea cifrada mediante el uso de https. Para esto necesitamos activar el cifrado ssl en apache, lo hacemos mediante la utilidad a2enmod ejecutando:

# a2enmod ssl

También debemos decir a apache que debe aceptar solicitudes en el puerto 443 que es el puerto estándar de https por lo que editamos el archivo /etc/apache2/ports.conf y agregamos la línea Listen 443, he aquí la configuración que tiene mi Apache2:

# 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
# This is also true if you have upgraded from before 2.2.9-3 (i.e. from
# Debian etch). See /usr/share/doc/apache2.2-common/NEWS.Debian.gz and
# README.Debian.gz

NameVirtualHost *:80
Listen 80

<IfModule mod_ssl.c>
 # If you add NameVirtualHost *:443 here, you will also have to change
 # the VirtualHost statement in /etc/apache2/sites-available/default-ssl
 # to <VirtualHost *:443>
 # Server Name Indication for SSL named virtual hosts is currently not
 # supported by MSIE on Windows XP.
 Listen 443
</IfModule>

<IfModule mod_gnutls.c>
 Listen 443
</IfModule>

Es importante aclarar que al menos tanto el módulo SSL como el puerto 443 ya se encontraban ‘activados’ cuando instalé Apache2.

Ahora necesitamos crear los certificados que utilizaremos para el cifrado, para ello utilizaremos OpenSSL, deberemos instalarlo ejecutando:

# aptitude install openssl

Por si no lo tenemos instalado, una vez que lo tengamos, se crean dos certificados, el público y el privado:

# openssl req -new -newkey rsa:2048 -nodes -out /etc/ssl/certs/publico.pem -keyout /etc/ssl/private/privado.pem

Country Name (2 letter code) [AU]: MX
State or Province Name (full name) [Some-State]: Chiapas
Locality Name (eg, city) []: Tuxtla Gutierrez
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Mi Organización
Organizational Unit Name (eg, section) []: Posh Inc
Common Name (eg, YOUR name) []: www.dominiocifrado.com
Email Address []: [email protected]

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

Los archivos generados serían:

La petición de nuevo certificado, que una autoridad certificadora (CA) tendrá que firmar, en /etc/ssl/certs/publico.pem.

La clave privada del certificado en /etc/ssl/private/privado.pem.

Podemos usar CAcert.org para firmar la petición de certificado. Debido a que CAcert.org tan sólo puede verificar la información contenida en el Common Name, da igual lo que introduzcamos en los otros campos (el resto lo descarta).

El certificado resultante después de la firma de CACert.org lo dejaremos en el archivo /etc/ssl/certs/publico.pem con permisos 644 para el usuario y grupo root. La clave privada ya se encuentra en /etc/ssl/private/privado.pem con permisos 640 para el usuario root, pero debemos cambiarle el grupo a ssl-cert:

chgrp ssl-cert /etc/ssl/private/privado.pem

Para utilizar los servicios de CACert.org debemos realizar los siguientes pasos:

  1. Darnos de alta en su web.
  2. Una vez validados en su sistema, dar de alta nuestro dominio dominiocifrado.com
  3. Una vez verificado nuestro dominio, procederemos a realizar la solicitud del certificado usando el contenido del fichero /etc/ssl/certs/publico.pem.

En el caso de que no querramos firmar el certificado por CACert.org, podemos hacerlo nosotros mismos:

openssl x509 -req -days 3650 -signkey privado.pem -out publico.pem

Nota: Es altamente recomendable hacerlo con CACert.org ya que es un ente reconocido y el servicio es gratuito. Si requieren algo más profesional, pueden checar con VeriSign.

Nota2: Cuando ya se encuentre firmado nuestro certificado nos llegará un correo electrónico indicándonos el contenido de la firma, el contenido de dicha firma debemos ponerla en lugar del contenido del archivo que se encuentra en /etc/ssl/certs/publico.pem

Ahora nada más queda tener nuestro archivo de configuración dentro de /etc/apache2/sites-available/dominiocifrado.conf

Aquí la configuración del archivo dominiocifrado.conf

<VirtualHost *:443>
 ServerAdmin [email protected]
 ServerName dominiocifrado.com
 ServerAlias www.dominiocifrado.com
 DocumentRoot /home/web/cifrada

 #Aquí indicamos que será un canal cifrado y los certificados que antes creamos, aquí los ubicamos
 SSLEngine on
 SSLCertificateFile "/etc/ssl/certs/publico.pem"
 SSLCertificateKeyFile "/etc/ssl/private/privado.pem"
 ErrorLog /var/log/apache2/dominiocifrado.eror.log
 CustomLog /var/log/apache2/dominiocifrado.access.log combined

 <Directory />
 Options FollowSymLinks
 AllowOverride None
 </Directory>
 <Directory /home/web/cifrada>
 Options Indexes FollowSymLinks MultiViews
 AllowOverride None
 Order allow,deny
 allow from all
 </Directory>
</VirtualHost>

Después procederemos a reiniciar nuestro servidor Apache con el siguiente comando:

# /etc/init.d/apache2 restart

Y entrar a nuestro nuevo sitio web cifrado:

https://dominiocifrado.com

Veremos nuestro certificado más o menos como esto:

Cifrado

Eso es todo, espero a alguien pueda parecerle útil esta información

Fuentes:

LinuxSilo.org

esDebian.org

2 comentarios en “Cifrado SSL con Apache2 en Debian”

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.