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.
Hola, una pregunta, ¿si no tengo nombre de dominio que deberia de poner?
Actualmente accedo a mi raspberry por la ip directamente.
Gracias.
Hola, estos certificados son para nombres de dominio. Si no tienes uno puedes obtener alguno gratis en http://www.freenom.com
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?
Hola, en ese caso tendrás que ejecutar el proceso dos veces. Una por cada dominio.