Certificado SSL gratuito para montar tu servidor seguro con Lighttpd

Tal y como reza su eslogan, Let’s Encrypt es una entidad certificadora gratuita, automatizada y abierta.

En este artículo contaré cómo instalar un certificado SSL de Let’s Encrypt en nuestro servidor Lighttpd y cómo forzar que todo el tráfico vaya por HTTPS.

Instalar acme.sh

acme.sh es un script para gestionar los certificados gratuitos de Let’s Encrypt.

Primero instalamos las dependencias:

sudo apt install git bc wget curl

Clonamos el repositorio:

git clone https://github.com/Neilpang/acme.sh.git

E instalamos:

cd acme.sh/
sudo -i
./acme.sh --install

Este último comando tiene que haber copiado ~/.bashrc el siguiente script de carga de variables:

. "$HOME/.acme.sh/acme.sh.env"

Cargamos las nueva variables:

source ~/.bashrc

Pasos previos

Crear el directorio .well-known/acme-challenge/

Ejecutar los siguientes comandos ajustando la variable D a nuestra ruta raíz del contenido web y el usuario www-data si fuera necesario:

D=/var/www/html
mkdir -vp ${D}/.well-known/acme-challenge/
###---[ NOTA: Adjustar el usuario si no es www-data ]---###
chown -R www-data:www-data ${D}/.well-known/acme-challenge/
chmod -R 0555 ${D}/.well-known/acme-challenge/

Crear la ruta para guardar el certificado

mkdir -p /etc/lighttpd/ssl/midominio.com/

Generar el fichero dhparams.pem

cd /etc/lighttpd/ssl/midominio.com/
openssl dhparam -out dhparams.pem -dsaparam 4096

Obtener certificado

Ejecutamos ajustando la ruta raíz y el dominio:

acme.sh --issue -w /var/www/html/ -d midominio.com

Configurar Lighttpd

Habilitamos el SSL:

lighty-enable-mod ssl

Y editamos el fichero de configuración correspondiente:

vi /etc/lighttpd/conf-enabled/10-ssl.conf

Debe quedar similar a éste pero ajustando las rutas:

### Todo por https
$HTTP["scheme"] == "http" {
 # capture vhost name with regex conditiona -> %0 in redirect pattern
 # must be the most inner block to the redirect rule
 $HTTP["host"] =~ ".*" {
 url.redirect = (".*" => "https://%0$0")
 }
}
### Fin todo por https

$SERVER["socket"] == "0.0.0.0:443" {
 ssl.engine = "enable"
 ssl.disable-client-renegotiation = "enable"

 ssl.pemfile = "/etc/lighttpd/ssl/midominio.com/ssl.pem"
 ssl.ca-file = "/etc/lighttpd/ssl/midominio.com/ca.cer"
 ssl.dh-file = "/etc/lighttpd/ssl/midominio.com/dhparams.pem"

# ECDH/ECDHE ciphers curve strength 
 ssl.ec-curve = "secp384r1"

ssl.use-compression = "disable"

# Environment flag for HTTPS enabled
 setenv.add-environment = (
 "HTTPS" => "on"
 )
 ssl.use-sslv2 = "disable"
 ssl.use-sslv3 = "disable"
 ssl.honor-cipher-order = "enable"
 ssl.cipher-list = "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"
 # HSTS(15768000 seconds = 6 months)
 setenv.add-response-header = (
 "Strict-Transport-Security" => "max-age=15768000;"
 )
}

Instalar el certificado

Creamos un script de instalación:

vi /root/.acme.sh/miburro.no-ip.org/hook.sh

Con el siguiente contenido. Como siempre ajustando midominio.com:

#!/bin/bash
dom="midominio.com"                    #your domain name 
dest="/etc/lighttpd/ssl/midominio.com" #lighttpd ssl path root
croot="/root/.acme.sh/${dom}"          #acme.sh root path for your domain
 
### NO edit below ###
sslfile="${dest}/ssl.pem"      #lighttpd .pem file path
certfile="${croot}/${dom}.cer" #lighttpd certficate file path 
keyfile="${croot}/${dom}.key"  #lighttpd key file path 
 
echo "Running lighttpd cmd..."
/bin/cat "${certfile}" "${keyfile}" > "${sslfile}"
/bin/systemctl restart lighttpd

Le damos permisos de ejecución:

chmod +x /root/.acme.sh/midominio.com/hook.sh

E instalamos:

acme.sh --installcert -d midominio.com --capath /etc/lighttpd/ssl/midominio.com/ca.cer --reloadcmd '/root/.acme.sh/midominio.com/hook.sh'

Y ya está. Si todo ha ido bien ahora todo el tráfico de nuestro servidor web se redirige a HTTPS con un certificado válido.

Por último, comentar que ahora en nuestro cron debe aparecer una línea similar a esta:

# Renovar certificado:
52 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

Esto lo que hace es cada noche comprobar si el certificado ha caducado y, si es caso, lo renueva.

Bibliografía

nixCraft

Lighttpd.net

4 comentarios en “Certificado SSL gratuito para montar tu servidor seguro con Lighttpd

  1. Hola, una pregunta, ¿si no tengo nombre de dominio que deberia de poner?

    Actualmente accedo a mi raspberry por la ip directamente.

    Gracias.

  2. Hola, una pregunta, en mi raspberry tengo dos dominios y mi duda es con la variable «D», esta variable aplica para los dos dominios o tengo que generar una nueva variable?

Deja un comentario