Migrar de HTTP a HTTPS en WordPress utilizando certificados SSL/TLS gratuitos de Let’s Encrypt


Introducción

Siempre fui consciente de que el blog utilizaba un protocolo no seguro (HTTP) con los navegadores de los usuarios. A ellos apenas les afecta, ya que la mayoría no requieren autenticarse para hacer uso de la web, pero su privacidad también es importante y el protocolo HTTPS la proporciona.

Tras meses mirando precios, los dos certificados que necesitaba para la web costaban dinero. Tampoco eran certificados firmados por CAs de reconocido renombre, los cuales aún eran más caros. Comentando el tema con Pablo, CEO de Rounada Soluciones Informáticas, él me informó de la existencia de un proyecto denominado Let’s Encrypt que sugió para promover una mayor seguridad en la web a través de la certificación gratuita de sitios web. Al día siguiente me puse manos a la obra y, pese a encontrarme unos cuantos problemas, ya es posible utilizar ingenieroinformatico.org bajo el protocolo HTTPS. Comparto en esta entrada el procedimiento seguido y los problemas encontrados para que os sean de ayuda en la migración de WordPress. Porque… ¿vas a migrar, verdad? Ahora ya no existen excusas para ofrecer webs encriptadas y más seguras.

Advertencias

Este tutorial (al igual que el resto de los del blog) no ofrece garantías de ningún tipo y la responsabilidad recae única y exclusivamente en Ud. como usuario final del mismo. Se recomienda realizar una copia de seguridad completa del servidor web (WordPress, BBDD, plantillas personalizadas, scripts, etc…), realizar el trabajo previamente en un entorno de pruebas previo paso a producción y disponer de todos los programas, SOs y librerías actualizadas.

Para la redacción de este tutorial se utilizó una web WordPress alojada en un servidor dedicado con SO Debian 7 alias Wheezy, con shell Bash y servido gracias a un Apache. Si sus entornos difirien el tutorial le pueden ser igualmente de ayuda, pero necesitará realizar las adaptaciones que correspondan.

Los conocimientos en informática que debe poseer el usuario deben ser medios ya que se trabajará con:

  • GNU/Linux
  • Certbot (script de generación y renovación de certificados)
  • Bash (o shell similar) como intérprete de órdenes
  • WordPress a nivel de programador (necesidad de configurar plugins, modificar plantillas, depuración web…)
  • Apache (o cualquier otro servidor web como Nginx)
  • Crontab para la automatización de tareas
  • Certificados SSL/TLS

Conceptos previos

En esta sección no se va a introducir a los conceptos básicos que se supone que Ud. al seguir este tutorial ya debería poseer (seguridad, certificados, protocolos, SSL, TLS, CA, etc…), tan sólo se le explicará brevemente qué es el proyecto Let’s Encrypt y para qué sirve el programa certbot.

El proyecto Let’s Encrypt

Let’s Encrypt es una iniciativa abanderada por la Linux Foundation que consiste en ofrecer una entidad certificadora libre, automática y abierta con el objetivo de ofrecer un servicio que beneficie al público general en internet. Este objetivo se pretende alcanzar ofreciendo certificados digitales para habilitar HTTPS en páginas web sin coste alguno, de la forma más sencilla y amigable posible, basándose en sólidos principios como el coste gratuito, la automatización de generación/renovación de los certificados, la seguridad, la transparencia, la estandarización y la cooperación.

El equipo encargado de proveer el servicio de Let’s Encrypt se denomina ISRG.

Certbot

Para la generación y renovación de los certificados es necesario utilizar un cliente para generar el certificado que utilice el protocolo ACME. El proyecto Let’s Encrypt recomienda utilizar certbot por ser un cliente de fácil utilización que genera y despliega certificados SSL/TLS en el servidor web. Antiguamente se conocía como el “cliente oficial de Le’ts Encrypt”.

Certbot no sólo genera los certificados: en servidores web populares como Apache, también configura automáticamente el servidor para utilizar HTTPS inmediatamente, aplicando configuraciones de seguridad, redireccionando HTTP a HTTPS, OCSP, HSTS y actualizando las peticiones que sean inseguras.

Certbot es desarrollado de forma abierta por la EFF para contribuir al esfuerzo de encriptar y asegurar internet por completo, objetivo compartido por la CA de Let’s Encrypt.
Generación e instalación de certificados

Generación e instalación de certificados

El procedimiento consiste en obtener el script de instalación de Certbot denominado certbot-auto, utilizarlo para instalar Certbot, generar los certificados, verificarlos y programar crontab para renovarlos. También es necesario modificar la configuración de WordPress.

Instalar Certbot

En el servidor iniciar sesión como usuario administrador

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

Actualizar el cliente e instalar dependencias mediante ./certbot-auto. A la hora de instalar las dependencias, seleccionar si/yes. La ejecución del script finalmente debería arrojar una salida al final similar a esta:

Updating certificates in /etc/ssl/certs... 171 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d....done.
Creating virtual environment.
Installing Python packages...
Installation succeeded.

Generación de certificados

Para generar los certificados se utilizará la orden

./path/to/certbot-auto --apache -d <dominio_raíz> -d

En nuestro caso el comando ejecutado fue

./path/to/certbot-auto --apache -d ingenieroinformatico.org -d www.ingenieroinformatico.org

El dominio raíz va primero. Los dos certificados son necesarios, ya que es posible redigirir todas las peticiones HTTP a HTTPS, pero no es posible redireccionar https://ingenieroinformatico.org a https://www.ingenieroinformatico.org si no se genera el segundo certificado.

Esto ejecutará la generación de los certificados para el servidor web apache y cambiará la configuración del mismo para que escuche en el puerto 443 por defecto.

Configuración de WordPress

La única modificación necesaria en WordPress tras la instalación de los certificados es muy puntual. Es necesario autenticarse como usuario administrador y en Ajustes actualizar el campo Dirección del sitio (URL) cambiando el protocolo a HTTPS para que WordPress maneje internamente la nueva URI.

La dirección del sitio debe actualizarse en WordPress para que el CMS pueda manejar internamente las referencias a las distintas páginas y entradas.
La dirección del sitio debe actualizarse en WordPress para que el CMS pueda manejar internamente las referencias a las distintas páginas y entradas.

Tras configurar WordPress conviene reiniciar el servidor web con

$ service apache2 restart

Renovación automática de certificados

Vía crontab, es necesario automatizar la renovación de los certificados para no tener que hacerlo manualmente. Desde Let’s Encrypt aconsejan realizarlo al menos dos veces al día, por si por cualquier motivo se nos revocan los certificados sea posible generar otros nuevos lo antes posible minimizando el tiempo de indisponibilidad de la web.

$ crontab -u <usuario> -e

Se abrirá el fichero de configuración cron del usuario correspondiente y se añadirá al final las siguientes líneas:

# Let's encrypt certificates renewal
0 0,12 * * * /root/certbot-auto renew --quiet --no-self-upgrade

Guardar los cambios en el editor de texto abierto y verificar la nueva configuración del cron:

$ crontab -l
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

# Let's encrypt certificates renewal
0 0,12 * * * /root/certbot-auto renew --quiet --no-self-upgrade

Verificación de certificados

Verificar los dos certificados generados en: https://www.ssllabs.com/ssltest/

Verificación SSL del dominio ingenieroinformatico.org utilizando la herramienta online de QUALYS SSL LABS.
Verificación SSL del dominio ingenieroinformatico.org utilizando la herramienta online de QUALYS SSL LABS.
Verificación SSL del otro dominio www.ingenieroinformatico.org utilizando la herramienta online de QUALYS SSL LABS.
Verificación SSL del otro dominio www.ingenieroinformatico.org utilizando la herramienta online de QUALYS SSL LABS.

Posible problemas

A continuación se describen tres problemas encontrados tras la instalación de los certificados y la configuración del servidor, de forma que os puedan servir de ayuda en caso de encontraros con un caso similar.

NotSupportedError

A la hora de generar los certificados y modificar la configuración de Apache Certbot arroja el siguiente error:

The apache plugin is not working; there may be problems with your existing configuration. The error was: NotSupportedError('Apache plugin support requires libaugeas0 and augeas-lenses version 1.2.0 or higher, please make sure you have you have those installed.',)

Así que se procederá a actualizar los paquetes:

$sudo apt-get install libaugeas0 augeas-lenses

Sin embargo todo está en su versión más reciente:

Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
augeas-lenses ya está en su versión más reciente.
libaugeas0 ya está en su versión más reciente.

Los paquetes indicados a continuación se instalaron de forma automática y ya no son necesarios.
libfile-copy-recursive-perl openbsd-inetd update-inetd
Use 'apt-get autoremove' to remove them.
0 actualizados, 0 se instalarán, 0 para eliminar y 10 no actualizados.

Si verificamos la versión de debian instalada, comprobamos que no es la última:

$ cat /etc/debian_version
7.11

Debian ya se encuentra en su versión 8, así que actualizamos el servidor siguiendo las instrucciones de
http://www.elarraydejota.com/adios-wheezy-hola-jessie-actualizando-de-debian-7-a-8-sin-dolores-de-cabeza/

Tras actualizar a Debian 8 se procede a volver a ejecutar el comando ./certbot-auto para actualizar el cliente.

Apache no arranca

Si tras actualizar a Debian 8 el servidor Apache no arranca arrojando el siguiente error:

$ service apache2 start
[FAIL] Starting web server: apache2 failed!
[warn] The apache2 configtest failed. ... (warning).

Output of config test was:
[Fri Dec 09 14:05:25.116972 2016] [:crit] [pid 2957:tid 140216976504704] Apache ed to recompile PHP.
AH00013: Pre-configuration failed
Action 'configtest' failed.
The Apache error log may have more information.

La solución se encuentra en http://askubuntu.com/questions/453377/how-to-enable-event-mpm-apache-2-4-on-ubuntu-14-04-with-thread-safe-php.

No se muestra el candado verde en el navegador

Tras la instalación de los certificados, al acceder al blog de WordPress a través de un navegador como Firefox, el candado que verifica que la página web está encriptida en su totalidad y es segura no aparece en verde. Firefox detectó contenido no seguro y muestra una advertencia junto al candado tal y como se muestra en la siguiente imagen.

Contenido no seguro en ingenieroinformatico.org.

Si se pulsa en el detalle de la advertencia (botón con flecha del lado derecho se muestra una descripción más específica. El enlace Saber más puede proporcionarnos ayuda útil.

Detalle de contenido no seguro en ingenieroinformatico.org.

Para dar con el problema lo mejor es ayudarse de la consola web de las herramientas del desarrollador, siguiendo las trazas que se muestran al recargar la página.

Las trazas de la consola web ayuda al desarrollador a dar con problemas de diversa índole, entre ellos aquellas partes no seguras del blog.
Las trazas de la consola web ayuda al desarrollador a dar con problemas de diversa índole, entre ellos aquellas partes no seguras del blog.

Tras leer los logs, en nuestro caso el problema se debe a la utilización de un plugin de CAPTCHAS que quedó obsoleto y no es compatible con HTTPS, por lo que se procedió a su inmediata sustitución por otro actualizado, más moderno, seguro y que sea compatible con el protocolo seguro.

Volvemos a recargar la página web forzando el refresco de caché con Ctrl + F5.

Contenido seguro en ingenieroinformatico.org.

En la consola web tampoco se muestra ningún error:

Contenido seguro en ingenieroinformatico.org utilizando la consola web.

Ahora el candado ya aparece de color verde garantizándole al usuario de forma visual que está visitando un sitio web seguro.

Detalle del contenido seguro en ingenieroinformatico.org.