Nginx SSL · 10 min read · Nov 17, 2025
Instalar Let's Encrypt y Asegurar Nginx con SSL/TLS en Debian 9
Este tutorial te mostrará cómo instalar y asegurar un servidor web Nginx en Debian 9 con un certificado TLS emitido de forma gratuita por la Autoridad de Certificación Let’s Encrypt. Además, configuraremos la renovación automática de los certificados TLS de Lets’ Encrypt utilizando un trabajo cron antes de que los certificados expiren.
TLS, también conocido como Seguridad de la Capa de Transporte, es un protocolo de red que utiliza certificados SSL para cifrar el tráfico de red que fluye entre un servidor y un cliente, o entre un servidor web, como el servidor Nginx, y un navegador. Todos los datos intercambiados entre estas dos entidades están asegurados y la conexión no puede ser descifrada incluso si es interceptada utilizando una técnica como un ataque de hombre en el medio o el sniffing de paquetes. El paquete de software certbot es la utilidad cliente oficial proporcionada por Let’s Encrypt CA que se puede utilizar en el proceso de generación y descarga de certificados gratuitos de Let’s Encrypt en Debian.
Requisitos
- Instalar LEMP Stack en Debian 9.
- Un nombre de dominio registrado públicamente con registros DNS adecuados (registros A o registros CNAME para subdominios).
- Acceso directo a la consola del servidor o acceso remoto SSH al servidor.
- Una cuenta de usuario con privilegios de root o acceso directo a la cuenta root.
Instalar la Utilidad Cliente Certbot
Para instalar la utilidad cliente cerbot de Let’s Encrypt en Debian 9 desde los repositorios oficiales de Debian, abre una terminal y emite el siguiente comando con privilegios de root, como se ilustra en la siguiente captura de pantalla.
apt-get install certbot
La utilidad apt de Debian, que es la interfaz de línea de comandos del Gestor de Paquetes principal de Debian, te preguntará, después de algunas verificaciones preliminares, si estás de acuerdo en continuar con la instalación del paquete certbot y todas sus dependencias requeridas. Para aceptar el proceso de instalación del software, responde con sí (y) en el aviso de la consola del servidor.
Obtener Certificado de Let’s Encrypt
Para generar y descargar certificados de Let’s Encrypt para un dominio, primero asegúrate de que el servidor web Nginx esté en funcionamiento y que al menos el puerto 80 sea accesible desde Internet. Para verificar si Nginx está en funcionamiento, ejecuta los siguientes comandos con privilegios de root.
sudo systemctl status nginxSi el servidor no está en funcionamiento, inicia el demonio Nginx con el siguiente comando.
sudo systemctl start nginxEn caso de que tengas un firewall común instalado en Debian, como el firewall UFW, que bloquea todas las conexiones entrantes en los puertos 80 y 443, emite los siguientes comandos para abrir los puertos HTTP y HTTPS en el sistema.
sudo ufw allow 80/tcpsudo ufw allow 443/tcpPara obtener certificados para tu dominio, ejecuta el comando cerbot en la consola con los siguientes parámetros y banderas como se explica a continuación. Ejecuta el comando con privilegios de root y proporciona tu nombre de dominio y todos los demás subdominios para los que deseas obtener certificados utilizando la bandera –d. Además, proporciona la opción –standalone para que certbot no interfiera con los archivos de configuración de Nginx. El servidor Nginx debe estar detenido mientras se emiten certificados utilizando esta opción.
La sintaxis del comando cerbot:
sudo certbot certonly --standalone –d yourdomain.com –d www.yourdomain.comCuando ejecutes por primera vez el comando certbot y obtengas el certificado, se te pedirá que agregues tu dirección de correo electrónico y que aceptes los términos de servicio de Let’s Encrypt. Escribe ‘ a ’ para aceptar los términos del servicio y ‘ no ’ para no compartir tu dirección de correo electrónico con los socios de Let’s Encrypt. Finalmente, después de haber obtenido el certificado para tu dominio, lee las notas al pie para localizar la ruta del sistema de certificados y la fecha en que expirarán.
Forma alternativa de obtener un certificado SSL de Let’s Encrypt
Para obtener un certificado de Let’s Encrypt a través del complemento “ webroot “, utiliza la siguiente sintaxis. Agrega el directorio raíz web de Nginx, que por defecto se encuentra en /var/www/html/, mientras emites el comando certbot con las banderas –webroot y –w. Además, asegúrate de que Nginx tenga permisos de escritura completos en el directorio raíz web para poder crear el directorio /.well-known.
La opción –webroot para cerbot también te pedirá que agregues tu dirección de correo electrónico para la renovación del certificado y los avisos de seguridad. El cliente Certbot tiene un código incorporado que puede detectar una dirección de correo electrónico falsa. Debes proporcionar una dirección de correo electrónico accesible públicamente para continuar obteniendo un certificado.
certbot certonly --webroot –w /var/www/html/ -d yourdomain.com –d www.yourdomain.com*Guardando el registro de depuración en /var/log/letsencrypt/letsencrypt.log**Ingresa la dirección de correo electrónico (utilizada para renovación urgente y avisos de seguridad) (Ingresa 'c' para**cancelar):[email protected] #Se detectará una dirección de correo electrónico falsa**Parece que hay problemas con esa dirección**. Ingresa la dirección de correo electrónico (utilizada para**renovación urgente y avisos de seguridad) Si realmente deseas omitir esto, puedes**ejecutar el cliente con --register-unsafely-without-email pero asegúrate de que luego**hagas una copia de seguridad de tu clave de cuenta de /etc/letsencrypt/accounts (Ingresa 'c' para cancelar):[email protected]** **-------------------------------------------------------------------------------**Por favor, lee los Términos de Servicio en**https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. Debes aceptar**para registrarte con el servidor ACME en**https://acme-v01.api.letsencrypt.org/directory**-------------------------------------------------------------------------------**(A)ceptar/(C)ancelar: a** **-------------------------------------------------------------------------------**¿Estarías dispuesto a compartir tu dirección de correo electrónico con la Electronic Frontier**Foundation, un socio fundador del proyecto Let's Encrypt y la organización sin fines de lucro**que desarrolla Certbot? Nos gustaría enviarte un correo electrónico sobre EFF y**nuestra labor para cifrar la web, proteger a sus usuarios y defender los derechos digitales.**-------------------------------------------------------------------------------**(S)í/(N)o: n**Obteniendo un nuevo certificado**Realizando los siguientes desafíos:**desafío http-01 para www.domain.com**Usando la ruta raíz web /var/www/html/ para todos los dominios no coincidentes.**Esperando verificación...**Limpiando desafíos** **NOTAS IMPORTANTES:** - ¡Felicidades! Tu certificado y cadena han sido guardados en** /etc/letsencrypt/live/www.yourdomain.com/fullchain.pem. Tu** certificado expirará el 2017-12-28. Para obtener una nueva versión o ajustada** de este certificado en el futuro, simplemente ejecuta certbot nuevamente. Para** renovar *todas* tus certificaciones de forma no interactiva, ejecuta "certbot** renew"** - Tus credenciales de cuenta han sido guardadas en tu Certbot** directorio de configuración en /etc/letsencrypt. Deberías** hacer una copia de seguridad segura de esta carpeta ahora. Este directorio de** configuración también contendrá certificados y claves privadas obtenidas** por Certbot, por lo que hacer copias de seguridad regulares de esta carpeta es ideal.** - Si te gusta Certbot, considera apoyar nuestro trabajo mediante:* * ** Donaciones a ISRG / Let's Encrypt: https://letsencrypt.org/donate** Donaciones a EFF: **https://eff.org/donate-le*
Configurar Nginx para TLS (SSL)
Un archivo de configuración TLS completo por defecto de Nginx para un dominio debería verse como en el siguiente extracto de archivo.
/etc/nginx/sites-enabled/default-ssl muestra un ejemplo de archivo:
* server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
server_name www.yourdomain.com yourdomain.com;
#server_name _;
root /var/www/html;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
#Certificados SSL
ssl_certificate "/etc/letsencrypt/live/www.yourdomain.com/cert.pem";
ssl_certificate_key "/etc/letsencrypt/live/www. yourdomain.com/privkey.pem";
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security "max-age=31536000;
#includeSubDomains" always;
location / {
index index.php index.html index.htm;
try_files $uri $uri/ /index.php?$args $uri/ =404;
}
set $cache_uri $request_uri;
location ~ /.well-known {
allow all;
}
#
# # Con php-fpm (o otros sockets unix):
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
# # Con php-cgi (o otros sockets tcp):
# fastcgi_pass 127.0.0.1:9000;
}
# negar acceso a archivos .htaccess, si la raíz de documentos de Apache
# coincide con la de nginx
#
#location ~ \.ht {
# deny all;
#}
** }*Las líneas de código para procesar scripts PHP a través del FastCGI Process Manager también se pueden encontrar en este extracto y se representan mediante las siguientes líneas.
*location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}
*Instalar Certificados de Let’s Encrypt en Nginx
Los certificados y claves de Let’s Encrypt se almacenan en el directorio /etc/letsencrypt/live/www.yourdomain.com/ en Debian. El comando ls contra el directorio anterior revelará todos los componentes del certificado, como el archivo de cadena, el archivo de fullchain, la clave privada y el archivo del certificado.
ls /etc/letsencrypt/live/www.yourdomain.com/Para instalar el certificado de Let’s Encrypt en el archivo de configuración TLS del servidor web Nginx, abre el archivo default-ssl de Nginx y actualiza las siguientes líneas para reflejar las rutas de los archivos del certificado de Let’s Encrypt para tu dominio, como se muestra en el siguiente extracto.
nano /etc/nginx/sites-enabled/default-sslCambia las siguientes líneas como se indica a continuación:
ssl_certificate "/etc/letsencrypt/live/www.yourdomain.com/cert.pem ";
ssl_certificate_key "/etc/letsencrypt/live/www.yourdomain.com /privkey.pem";**
Además, si la declaración ssl_dhparam está presente en la configuración SSL de Nginx, debes generar una nueva clave de Diffie–Hellman de 2048 bits emitiendo el siguiente comando. La generación de parámetros de clave de Diffie–Hellman debería tardar un tiempo dependiendo de la aleatoriedad o entropía de tu sistema.
openssl dhparam –out /etc/nginx/dhparam.pem 2048Finalmente, antes de activar la configuración TLS de Nginx reiniciando el demonio Nginx para reflejar los cambios, primero verifica las configuraciones de Nginx en busca de posibles errores de sintaxis. Después, si la prueba del archivo de configuración de Nginx es exitosa, reinicia el demonio Nginx para cargar la nueva configuración junto con los certificados de Let’s Encrypt, emitiendo los siguientes comandos.
nginx -tservice nginx restartPara verificar si el servicio nginx tiene un socket abierto en estado de escucha en el puerto 443, ejecuta el comando netstat como se muestra en el siguiente extracto.
netstat –tulpn | grep -e 443 -e LISTENTambién deberías abrir un navegador y navegar a tu nombre de dominio a través del protocolo HTTPS. Si los certificados de Let’s Encrypt se aplican correctamente en Nginx, el apretón de manos SSL debería funcionar sin problemas y sin arrojar errores.
Forzar tráfico web a HTTPS
Para obligar a los visitantes de tu dominio a navegar por tu sitio web solo a través del protocolo HTTPS, abre el archivo de configuración por defecto de Nginx en sites-enabled y agrega la siguiente línea, que obliga a todas las solicitudes que lleguen al puerto 80 a ser redirigidas con un código de estado 301 (movido permanentemente) al puerto 443.
nano /etc/nginx/sites-enabled/defaultLa declaración de redirección debería verse como se presenta en el siguiente extracto.
*server_name www.yourdomain.com yourdomain.com;
**return 301 https://$server_name$request_uri;*
Posteriormente, reinicia el demonio Nginx para aplicar el cambio, emitiendo el siguiente comando.
service nginx restartComprobaciones finales
Para investigar más a fondo los certificados generados por la CA de Let’s Encrypt, puedes usar un navegador web moderno, como Chrome. Visita tu dominio desde el navegador Chrome y presiona la tecla de función F12 para abrir las Herramientas de Desarrollo. Navega a la pestaña de Seguridad y haz clic en el botón Ver certificado para abrir el certificado, como se muestra en las siguientes capturas de pantalla.
Otra utilidad útil para investigar certificados SSL es la utilidad de línea de comandos openssl. Para mostrar información adicional sobre un certificado de CA de Let’s Encrypt, ejecuta el siguiente comando en una consola de Linux.
openssl s_client –connect www.yourdomain.com:443
Renovar automáticamente el Certificado de Let’s Encrypt
Para renovar automáticamente un certificado emitido por la CA de Let’s Encrypt antes de la fecha de expiración, programa un trabajo de crontab para que se ejecute una vez al día a las 2:00 AM, emitiendo el siguiente comando. La salida del trabajo cron ejecutado se dirigirá a un archivo de registro, almacenado en /var/log/letsencrypt.log
crontab –eTrabajo cron para renovar el certificado.
**0 2 * * *** certbot renew >> /var/log/letsencrypt.log¡Eso es todo! Para otras configuraciones más avanzadas relacionadas con los certificados y la utilidad de Let’s Encrypt, visita la documentación oficial en la siguiente dirección de Internet https://certbot.eff.org/docs/.
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.