Certbot, obtención y renovación de certificados Let’s Encrypt en Lighttpd

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 :

sudo git clone https://github.com/certbot/certbot /opt/letsencrypt
cd /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:

./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.

......
......
Installation succeeded.
Requesting root privileges to run certbot...
/home/pi/.local/share/letsencrypt/bin/letsencrypt certonly --webroot -w /var/www/ -d tudominio.es -d www.tudominio.es
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel):hefistion@gmail.com

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree
in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: a
....
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for tudominio.es
http-01 challenge for www.tudominio.es
Using the webroot path /var/www/tudominio.es  for all unmatched domains.
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/tudominio.es/fullchain.pem. Your
   cert will expire on 2017-09-29. To obtain a new or tweaked version
   of this certificate in the future, simply run certbot-auto again.
   To non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   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:

sudo systemctl stop lighttpd

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

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

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

nano /etc/lighttpd/lighttpd.conf

Y añadimos:

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

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

sudo 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:

sudo systemctl stop lighttpd

Editamos el fichero /etc/lighttpd/lighttpd.conf

nano /etc/lighttpd/lighttpd.conf

Y añadimos:

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

Ya solo queda volver a arrancar el servidor:

sudo 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

touch /home/pi/letsencrypt.sh

Le damos permisos de ejecución

chmod +x /etc/cron.weekly/letsencrypt

Editamos el ficheros

nano /etc/cron.weekly/letsencrypt

Añadimos el siguiente texto :

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

Probamos que funciona

./letsencrypt.sh

Requesting root privileges to run certbot...
  /home/pi/.local/share/letsencrypt/bin/letsencrypt renew --webroot --webroot-path /var/www/
Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/tu.dominio.xx.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal

The following certs are not due for renewal yet:
  /etc/letsencrypt/live/tu.dominio.xx/fullchain.pem (skipped)
No renewals were attempted.
[ 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.

crontab -e

Añadimos

0 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 :

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

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

sudo systemctl restart lighttpd

Backups y Restaurar certificados

Backup

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

sudo 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

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

Restaurar

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

tar zxvf /ruta/letsencrypt_backup_2016-10-23_0114.tar.gz -C /
comentario powered by Disqus