Obtención y renovación de certificados Let’s Encrypt en Lighttpd

7 minutos de lectura

Introducción

Si sólo vas a acceder a tu servidor web local desde tu propia red local, quizás no necesites un certificado SSL para encriptar la comunicación entre el cliente web que utilices y tu servidor, pero si tu servidor va a estar expuesto a Internet, se hace casi obligatorio el tener un certificado SSL.

Un opción sencilla es crearte tu propio certificado firmado por ti, el problema es que cuando un cliente quiera acceder al servidor web será preguntado por la confianza de ese certificado ya que no esta firmado por ninguna autoridad de certificación, sin embargo gracias a Let’s Encrypt podemos tener nuestro propio certificado SSL de una forma gratuita.

Existen muchas formas de obtener este certificado yo voy a explicar su instalación sobre lighttpd como servidor web y utilizando certbot para la obtención y renovación del certificado.

Los certificados que proporciona Let’s Encrypt de forma gratuita tienen una validez de 3 meses por lo que es necesario, pasado ese tiempo, renovarlos. Para ello, mediante un sencillo script y cron lo renovaremos de forma automática.

También voy a explicar la forma de redirigir todo el trafico que llegue al puerto 80 del servidor hacia el puerto 443 forzando el uso de HTTPS.

Y por ultimo, veremos la forma de implementar TTP Strict Transport Security (HSTS) en lighttpd para aumentar la seguridad de nuestro servidor.

Instalación

Bajamos la ultima version de certbot desde el repositorio de github y lo ponemos en /opt//opt/letsencrypt :

1sudo git clone https://github.com/certbot/certbot /opt/letsencrypt
2cd /opt/letsencrypt

Ejecutamos el script certbot-auto, el cual nos descargara los paquetes de software que aun no tengamos instalados y solicita nuestro certificado, cambia las rutas y nombres de dominio a los que correspondan:

1./certbot-auto certonly --webroot -w /var/www/tudomino.es/ -d tudominio.es -d www.tudominio.es

En el ejemplo he solicitado un simple certificado para los dominios tudominio.es y www.tudominio.es

Después de instalar los paquetes necesarios, el script empezará con el proceso de solicitud, nos pedirá una dirección de correo y debemos de aceptar las condiciones del servicio.

certbot escribirá unos archivos temporales en var/wwww/tudominio.es para comprobar que eres el propietario del dominio, así que asegúrate de que estos nombres de dominio existen antes de solicitar el certificado si no quieres obtener un error.

 1......
 2......
 3Installation succeeded.
 4Requesting root privileges to run certbot...
 5/home/pi/.local/share/letsencrypt/bin/letsencrypt certonly --webroot -w /var/www/ -d tudominio.es -d www.tudominio.es
 6Saving debug log to /var/log/letsencrypt/letsencrypt.log
 7Enter email address (used for urgent renewal and security notices) (Enter 'c' to
 8cancel):hefistion.arroba.mail.com
 9
10-------------------------------------------------------------------------------
11Please read the Terms of Service at
12https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree
13in order to register with the ACME server at
14https://acme-v01.api.letsencrypt.org/directory
15-------------------------------------------------------------------------------
16(A)gree/(C)ancel: a
17....
18Obtaining a new certificate
19Performing the following challenges:
20http-01 challenge for tudominio.es
21http-01 challenge for www.tudominio.es
22Using the webroot path /var/www/tudominio.es  for all unmatched domains.
23Waiting for verification...
24Cleaning up challenges
25
26IMPORTANT NOTES:
27 - Congratulations! Your certificate and chain have been saved at
28   /etc/letsencrypt/live/tudominio.es/fullchain.pem. Your
29   cert will expire on 2017-09-29. To obtain a new or tweaked version
30   of this certificate in the future, simply run certbot-auto again.
31   To non-interactively renew *all* of your certificates, run
32   "certbot-auto renew"
33 - If you like Certbot, please consider supporting our work by:
34
35   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
36   Donating to EFF:                    https://eff.org/donate-le

Si todo ha ido bien, al final se nos informa de que se ha creado una copia del certificado en /etc/letsencrypt/live/tudominio.es/fullchain.pem y la fecha de caducidad del certificado, 2017-09-29.

Configuración de lighttpd

Antes de nada debemos de parar el servidor:

1sudo systemctl stop lighttpd

Ahora debemos de combinar los dos certificados para que lighttpd pueda trabajar con ellos

1cd /etc/letsencrypt/live/tudominio.es
2cat privkey.pem cert.pem > ssl.pem

Editamos el fichero etc/lighttpd/lighttpd.conf para que lighttpd trabaje con nuestros certificados SSL:

1nano /etc/lighttpd/lighttpd.conf

Y añadimos:

1$SERVER["socket"] == ":443" {
2        ssl.engine = "enable"
3        ssl.pemfile = "/etc/letsencrypt/live/tudominio.es/ssl.pem"
4        ssl.ca-file =  "/etc/letsencrypt/live/tudominio.es/fullchain.pem"
5        ssl.cipher-list = "ECDHE-RSA-AES256-SHA384:AES256-SHA256:HIGH:!MD5:!aNULL:!EDH:!AESGCM"
6        ssl.honor-cipher-order = "enable"
7        ssl.use-sslv2 = "disable"
8        ssl.use-sslv3 = "disable"
9}

Volvemos a arrancar el servidor y ya tendremos listo nuestro certificado:

1sudo systemctl start lighttpd

Redirigir todo el trafico hacia HTTPS

Este paso es opcional pero altamente recomendable, ya que forzaremos la encriptación del tráfico en nuestro servidor.

Antes de nada debemos de parar el servidor:

1sudo systemctl stop lighttpd

Editamos el fichero /etc/lighttpd/lighttpd.conf

1nano /etc/lighttpd/lighttpd.conf

Y añadimos:

1$HTTP["scheme"] == "http" {
2        $HTTP["host"] =~ "tudominio.es" {
3                url.redirect = ( "^/(.*)" => "https://tudominio.es/$1" )
4        }
5}

Ya solo queda volver a arrancar el servidor:

1sudo systemctl start lighttpd

Renovación del certificado de forma automática

Los certificados de letsencrypt tienen una validez de 3 meses, para evitar el estar pendientes de cuando caduca, vamos a crear un script para que todos los dìas a las 20 horas pregunte si el certificado ha caducado y en caso de que así sea renovarlo de una forma automática.

En el ejemplo lo voy a realizar usando cron.

Creamos el fichero letsencrypt.sh

1touch /home/pi/letsencrypt.sh

Le damos permisos de ejecución

1chmod +x /etc/cron.weekly/letsencrypt

Editamos el ficheros

1nano /etc/cron.weekly/letsencrypt

Añadimos el siguiente texto :

 1#!/bin/sh
 2# Automatically Renew Letsencrypt Certs
 3# Edit webroot-path with your www folder location
 4/opt/letsencrypt/letsencrypt-auto renew --webroot --webroot-path /var/www/
 5# Rebuild the cert
 6# Edit folder location to your domainname
 7cd /etc/letsencrypt/live/tu.dominio.xx/
 8sudo bash -c "cat privkey.pem cert.pem > ssl.pem"
 9# Reload lighttpd
10sudo /etc/init.d/lighttpd reload

Probamos que funciona

 1./letsencrypt.sh
 2
 3Requesting root privileges to run certbot...
 4  /home/pi/.local/share/letsencrypt/bin/letsencrypt renew --webroot --webroot-path /var/www/
 5Saving debug log to /var/log/letsencrypt/letsencrypt.log
 6
 7-------------------------------------------------------------------------------
 8Processing /etc/letsencrypt/renewal/tu.dominio.xx.conf
 9-------------------------------------------------------------------------------
10Cert not yet due for renewal
11
12The following certs are not due for renewal yet:
13  /etc/letsencrypt/live/tu.dominio.xx/fullchain.pem (skipped)
14No renewals were attempted.
15[ ok ] Reloading web server configuration: lighttpd.

Por último programamos cron para que ejecute el script letsencrypt.sh todos los días a las 20 horas.

1crontab -e

Añadimos

10 20 * * * /home/pi/letsencrypt/letsencrypt.sh

Implementando TTP Strict Transport Security (HSTS)

Para finalizar vamos a securizar un poco mas lighttpd añadiendo HSTS

El principal objetivo de HSTS es impedir que un atacante convierta una conexión HTTPS en HTTP

Para habilitar HSTS en lighttpd editamos el fichero de configuración /etc/lighttpd/lighttpd.conf y añadimos :

1server.modules += ( "mod_setenv" )
2$HTTP["scheme"] == "https" {
3    setenv.add-response-header  = ( "Strict-Transport-Security" => "max-age=63072000; includeSubdomains; ")
4}

Bastará con reiniciar el servidor para qe los cambios tengan efecto

1sudo systemctl restart lighttpd

Backups y Restaurar certificados

Backup

Podemos usar el comando tar para realizar una copia del directorio /etc/letsencrypt

1sudo tar zcvf /ruta/letsencrypt_backup_$(date +'%Y-%m-%d_%H%M').tar.gz /etc/letsencrypt

Este comando preservará los permisos (si lanzamos el comando como root) y por defecto tar conserva los enlaces simbólicos.

Podemos comprobar el contenido del fichero usando el comando

1tar tvf /ruta/letsencrypt_backup_2016-10-23_0114.tar.gz

Restaurar

Para restaurar la copia en el directrio etc/lestencrypt usaremos el comando:

1tar zxvf /ruta/letsencrypt_backup_2016-10-23_0114.tar.gz -C /

Espero que te haya gustado, pasa un buen día.