Let's Encrypt
Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →
LetsEncrypt es un servicio que proporciona certificados SSL/TLS gratuitos a los usuarios. Certbot es un cliente que facilita la obtención y automatización de estos certificados. Además, cuenta con complementos para Apache y Nginx que simplifican aún más la generación automatizada de certificados.
Las instrucciones de instalación para la mayoría de distribuciones Linux están disponibles en el sitio web de Certbot.
Una vez instalados los paquetes, estás listo para generar un nuevo certificado.
Apache
Complemento Apache de Certbot
Tras instalar Certbot y el complemento para Apache, la generación del certificado se realiza con el siguiente comando.
certbot certonly --apache --noninteractive --agree-tos --email YOUR_EMAIL -d DOMAIN_NAME
Actualiza las secciones 'SSLCertificateFile' y 'SSLCertificateKeyFile', luego reinicia el servicio.
Añade una tarea cron para renovar automáticamente el certificado.
echo "0 0 * * * root certbot renew --quiet --no-self-upgrade --post-hook 'systemctl reload apache2'" | sudo tee -a /etc/cron.d/renew_certbot
Método Webroot de Certbot
Debian
Si el complemento Apache de Certbot no funciona con tu configuración, utiliza el método webroot.
Añade lo siguiente en tu sección <VirtualHost> después de configurarlo como proxy inverso:
DocumentRoot /var/www/html/
#Do not pass the .well-known directory when using certbot and webroot
ProxyPass /.well-known !
Ejecuta el comando certbot como root:
sudo certbot certonly --webroot -w /var/www/html --agree-tos --email YOUR_EMAIL -d DOMAIN_NAME
Caddy
Caddy gestiona automáticamente la obtención de certificados SSL de Let's Encrypt cuando se proporciona un nombre de dominio. No se requiere acción manual.
HAProxy
HAProxy actualmente no tiene un complemento para Certbot. Para solucionarlo, ejecuta Certbot en modo independiente y redirige el tráfico a través de tu red.
Habilita el frontend y backend en la configuración anterior, y luego ejecuta Certbot.
certbot certonly --standalone --preferred-challenges http-01 --http-01-port 8888 --noninteractive --agree-tos --email YOUR_EMAIL -d DOMAIN_NAME
Puedes cambiar el puerto al que prefieras, pero asegúrate de que coincida en la configuración de HAProxy y tu comando Certbot.
HAProxy necesita los archivos de certificado y clave concatenados en un mismo archivo. Esto se logra con el siguiente comando.
cat /etc/letsencrypt/live/DOMAIN_NAME/fullchain.pem /etc/letsencrypt/live/DOMAIN_NAME/privkey.pem > /etc/ssl/DOMAIN_NAME.pem
Descomenta bind *:443 y la sección de redirección en la configuración, luego recarga el servicio.
Renovación Automática de Certificados
Coloca el siguiente script en /usr/local/bin/ para actualizar automáticamente tu certificado SSL.
SITE=DOMAIN_NAME
# move to the correct let's encrypt directory
cd /etc/letsencrypt/live/$SITE
# cat files to make combined .pem for haproxy
cat fullchain.pem privkey.pem > /etc/ssl/$SITE.pem
# reload haproxy
service haproxy reload
Asegúrate de que el script sea ejecutable.
chmod u+x /usr/local/bin/letsencrypt-renew.sh
Añade una tarea cron para renovar automáticamente el certificado.
@monthly /usr/bin/certbot renew --renew-hook "/usr/local/bin/letsencrypt-renew.sh" >> /var/log/letsencrypt-renewal.log
Nginx
Tras instalar Certbot y el complemento para Nginx con sudo apt install certbot python3-certbot-nginx, genera el certificado.
Nota: En distribuciones Fedora (ej. CentOS 8) usa sudo dnf install python3-certbot-nginx para instalar el complemento de Nginx.
sudo certbot --nginx --agree-tos --redirect --hsts --staple-ocsp --email YOUR_EMAIL -d DOMAIN_NAME
Añade el parámetro --rsa-key-size 4096 si prefieres una clave de 4096 bits.
Copia y pega el archivo de configuración completo de Nginx del ejemplo anterior, ajustando los parámetros según tu configuración y descomentando las líneas.
Añade una tarea cron para renovar automáticamente el certificado.
echo "0 0 * * * root certbot renew --quiet --no-self-upgrade --post-hook 'systemctl reload nginx'" | sudo tee -a /etc/cron.d/renew_certbot
Let's Encrypt con Docker
Esta sección asume que Jellyfin se ejecuta en un contenedor Docker (en Linux). También asume que deseas ejecutar Let's Encrypt en otro contenedor Docker. El contenedor Linuxserver/swag incluye un servidor web nginx integrado para gestionar el proxy inverso.
linuxserver/letsencrypt está obsoleto en favor de linuxserver/swag. Consulta la guía de migración de SWAG en GitHub si necesitas migrar.
Primero, necesitas determinar algunos aspectos.
-
¡ASEGÚRATE DE TENER UN REGISTRO CNAME PARA JELLYFIN CONFIGURADO EN TU PROVEEDOR DE DNS ANTES DE CONTINUAR!
-
Dónde deseas almacenar la información relacionada con Let's Encrypt (en Docker estos se llaman "volúmenes")
-
Qué subdominio o subcarpeta deseas usar con Let's Encrypt (ej. jellyfin.ejemplo.com)
-
Qué zona horaria deseas utilizar
-
Si usarás HTTP-01 o DNS-01 para los desafíos de validación
-
En qué red ejecutarás el contenedor (recomiendo la red macvlan predeterminada llamada "br0")
-
Qué dirección IP deseas asignar a tu contenedor
-
Qué puertos utilizarás (ej. 180 para el puerto 80, y 1443 para el 443)
-
Asegúrate de que los puertos 80 (si usas validación http) y 443 estén redirigidos al contenedor Docker desde tu router (las instrucciones varían según el fabricante)
-
Qué usuario ejecutará el contenedor (puedes determinar el PUID y PGID ejecutando
id[reemplazando "user" por el nombre de usuario que ejecutará el contenedor])
Si estás utilizando el desafío DNS-01, puedes encontrar el listado de plugins DNS compatibles en la documentación de Certbot.
Luego, dependiendo de esas configuraciones, deberás ajustar los valores siguientes según sea necesario.
Por ejemplo, el comando docker create del equipo de LinuxServer para el contenedor Docker Swag:
docker create \
--name=swag \
--cap-add=NET_ADMIN \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Europe/London \
-e URL=example.com \
-e SUBDOMAINS=www, \
-e VALIDATION=http \
-e DNSPLUGIN=cloudflare `#optional` \
-e DUCKDNSTOKEN=<token> `#optional` \
-e EMAIL=<e-mail> `#optional` \
-e DHLEVEL=2048 `#optional` \
-e ONLY_SUBDOMAINS=false `#optional` \
-e EXTRA_DOMAINS=<extradomains> `#optional` \
-e STAGING=false `#optional` \
-p 443:443 \
-p 80:80 `#optional` \
-v </path/to/appdata/config>:/config \
--restart unless-stopped \
linuxserver/swag
Siguiendo esta plantilla y ajustando para mi región, puertos y rutas, quedaría así (con información personal omitida):
docker create --name=swag --cap-add=NET_ADMIN -e PUID=1000 -e PGID=1000 -e TZ=America/Chicago -e URL=example.com -e SUBDOMAINS=jellyfin -e VALIDATION=http -e EMAIL=email@email.com -e DHLEVEL=2048 -e ONLY_SUBDOMAINS=false -e STAGING=false -p 443:443 -p 80:80 -v /path/to/appdata/swag/:/config --restart unless-stopped linuxserver/swag
Esto descargará el contenedor linuxserver/letsencrypt y lo creará con las variables especificadas. Luego deberás iniciar el contenedor con docker start swag. Puedes verificar que se ha iniciado ejecutando docker ps, que mostrará una salida como esta:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
09346434b8ea linuxserver/swag "/init" 2 minutes ago Up 5 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp swag
En este punto, navega al volumen que seleccionaste (en mi ejemplo es /mnt/swag). Luego deberás acceder a nginx/proxy-confs dentro de ese directorio. Si listas el contenido de ese directorio, verás muchos archivos.
El que nos interesa para Jellyfin es jellyfin.subdomain.conf.sample (si usas subdominio) o jellyfin.subfolder.conf.sample (si usas subcarpeta). Deberás copiar el archivo necesario, eliminando la extensión .sample (ej. cp jellyfin.subdomain.conf.sample jellyfin.subdomain.conf). Ábrelo en tu editor de texto preferido.
Debería verse así (este archivo es jellyfin.subdomain.conf, aunque jellyfin.subfolder.conf es muy similar):
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name jellyfin.*;
include /config/nginx/ssl.conf;
client_max_body_size 0;
location / {
include /config/nginx/proxy.conf;
resolver 127.0.0.11 valid=30s;
set $upstream_app jellyfin;
set $upstream_port 8096;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
proxy_set_header Range $http_range;
proxy_set_header If-Range $http_if_range;
}
location ~ (/jellyfin)?/socket/ {
include /config/nginx/proxy.conf;
resolver 127.0.0.11 valid=30s;
set $upstream_app jellyfin;
set $upstream_port 8096;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
}
}
Las líneas que nos interesan son set $upstream_app jellyfin. Suponiendo que Jellyfin y Let's Encrypt estén en la misma red dentro de Docker, debería detectarlo y manejar el proxy inverso sin problemas. Si no lo hace, simplemente cambia jellyfin en esa línea por la IP de tu servidor Jellyfin. También revisaremos la línea location ~ (/jellyfin)?/socket y añadiremos una barra después de socket, quedando así: location ~ (/jellyfin)?/socket/.
Luego, en la configuración de Jellyfin (Panel de control -> Red), desplázate hasta "Puerto HTTP público" y "Puerto HTTPS público", y asegúrate de que el puerto HTTP sea 8096, mientras que el puerto HTTPS sea 8920.
Reinicia tu contenedor Docker de Let's Encrypt ejecutando docker restart swag, y luego puedes seguir los registros con docker logs -f swag. Si todo funciona correctamente, deberías ver Server Ready al final de los registros. Esto indica que Let's Encrypt se está ejecutando sin problemas.