Configurando mod_ssl con certificado gratis y válido

El protocolo https se está convirtiendo en una necesidad a la hora de tener un website que ofrezca algo de seguridad en internet. En un futuro los navegadores tacharán de inseguros los sitios web que no tengan https habilitado y adecuadamente configurado así que no está de más tener configurado esta característica en nuestro servidor web.

Anteriormente hablábamos sobre la instalación de Apache en un servidor Debian. En este artículo le toca el turno a configurar mod_ssl, con esto habilitaremos el protocolo HTTPS de nuestro servidor web Apache a través del puerto 443 (por defecto) o el que le indiquemos en la configuración.

Para tener un certificado válido nos ayudaremos de letsencrypt, el cual es gratuito y validado por una entidad certificadora, con ello podemos configurar nuestro servidor para tener una calidad A+ en el certificado y ofrecer una conexión https de calidad.

Instalación de mod_ssl

Para instalar mod_ssl teclearemos en nuestra shell los siguientes comandos:

# a2enmod ssl
# service apache2 restart

Configuración mod_ssl

Para configurar la conexión ssl por defecto nos iremos al fichero /etc/apache2/sites-available/default-ssl.conf a continuación dejo un ejemplo del fichero configurado, más adelante explicaré las opciones.

<VirtualHost *:443>
    ServerAdmin webmaster@localhost
    ServerName dominio.com
    ServerAlias www.dominio.com
    DocumentRoot /var/www/dominio
    Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains;
    <Directory /var/www/dominio.com>
                Options -Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    SSLEngine on
    SSLProtocol all -SSLv3 -SSLv2
    SSLHonorCipherOrder on 
    SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
    SSLCertificateFile    /etc/letsencrypt/live/dominio.com/cert.pem
    SSLCACertificateFile    /etc/letsencrypt/live/dominio.com/fullchain.pem
    SSLCertificateChainFile /etc/letsencrypt/live/dominio.com/chain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/dominio.com/privkey.pem
    SSLCompression off  
    <FilesMatch "\.(cgi|shtml|phtml|php)$">
                SSLOptions +StdEnvVars
    </FilesMatch>
    <Directory /usr/lib/cgi-bin>
                SSLOptions +StdEnvVars
    </Directory>
</VirtualHost>
</IfModule>

Como vemos en la configuración  para mod_ssl tenemos varias opciones de las cuales explicaré las relacionadas con el cifrado de la conexión de nuestra web.

  • Configuramos el header HSTS, le asignamos el tiempo máximo y le indicamos que incluya los subdominios.
  • Con la opción SSLProtocol le indicamos que soporte todos los protocolos menos SSLv3 y SSLv2. Con ello evitamos que puedan degradarnos el servicio a uno de estos dos protocolos y evitamos ataques como POODLE.
  • Deshabilitamos la compresión con la opción SSLCompression. Deshabilitando la compresión de las conexiones TLS evitamos ataques como CRIME.
  • Con SSLCipherSuite indicamos todas las suites de cifrado que soporta nuestro servidor, con esta opción y SSLProtocol indicamos sólo los protocolos que no son vulnerables, así podemos prevenir vulnerabilidades de degradación de calidad del certificado como Poodle.
  • Adicionalmente podemos configurar HPKP (Http Public Key Pinning) pero lo veremos en otro artículo más adelante.

Una vez terminada la edición del archivo, guardamos y habilitamos el sitio ssl por defecto con el siguiente comando:

a2ensite default-ssl.conf

Acto seguido reiniciamos el servicio apache2 y ya tendremos mod_ssl funcionando, probamos la configuración accediendo desde el navegador.

Certificados letsencrypt

Uno de los principales problemas de ofrecer un servicio HTTPS adecuado es poder tener un certificado validado por una entidad certificadora y correctamente configurado, por defecto apache instala sus certificados autofirmados, cosa que sirven si es un entorno de desarrollo o de pruebas, pero a la hora de tener una aplicación web en producción es bastante tedioso para los clientes tener que estar añadiendo excepciones de seguridad porque nuestro certificado no cumpla los requerimientos de seguridad. Por lo general un certificado conlleva un coste económico cada cierto tiempo, pero en este caso usaremos los certificados de letsencrypt, una entidad certificadora gratuita y abierta con la que podemos tener nuestro servicio HTTPS bien configurado y sin coste.

Para obtener certificados de letsencrypt usaremos la herramienta certbot, esta herramienta se encarga de pedir el certificado validado y descargarlo en nuestra máquina del dominio que le indiquemos. Para darnos el certificado del dominio que queramos, necesitamos tener la dns del dominio apuntando al servidor donde debamos instalar el certificado.

Existen varias formas de obtener el certificado, certbot necesita un servicio web para obtener el certificado y nos ofrece varias opciones, la más comun es parar apache y ejecutar el standalone server de certbot pero también teneis otra opción para instalarlo directamente usando el servidor apache de nuestra máquina. Si queréis documentación completa acerca de certbot, visitad la web de la EFF(Electronic Frontier Foundation).

El proyecto está en github y podemos obtenerlo con un simple comando:

git clone https://github.com/certbot/certbot.git

Alternativamente podemos descargarlo de la web de la EFF:

wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto

Una vez clonado el git o descargado con wget, accedemos a su directorio, paramos el servicio apache2 y lanzamos el siguiente comando:

./certbot-auto certonly -d dominio.com -d www.dominio.com -d ftp.dominio.com

Indicaremos los dominios que necesitemos para ese certificado con el modificador -d, como mímino para una página web son dos: el dominio www.dominio.com y sin “www”. Cuando ejecutemos el comando el asistente de certbot nos guiará durante la instalación del certificado.

Una vez hayamos terminado el proceso, nos creará los certificados en /etc/letsencrypt/live/dominio.com/. Hecho esto, sólo nos quedaría configurar apache con la configuración descrita más arriba.

Debemos renovar los certificados cada 3 meses, para ello ejecutaremos el siguiente comando:

./certbot-auto renew

Con esto ejecutará el asistente que revisará qué certificados necesitan ser renovados.

Comprobando la calidad de nuestra conexión HTTPS

Para comprobar la calidad de nuestro HTTPS podemos usar el test online de la web de ssllabs, en el nos darán una calificación en base a la configuración que detecten ellos con sus tests, así, si se nos ha pasado configurar algo podemos comprobarlo fácilmente.