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