Let's Encrypt es una autoridad de certificación (CA) gratuita, de código abierto y automatizada iniciada por Internet Security Research Group (ISRG) y ofrece certificados SSL/TLS para cifrar comunicaciones entre dos partes.
Un certificado SSL en su sitio web no solo aumentará la seguridad de su sitio web a través del cifrado, sino que también mejorará la clasificación SEO de su sitio, ya que Google ha hecho obligatorio incluir un certificado SSL para una mejor clasificación SEO.
En este artículo, investigaremos cómo proteger un servidor NGINX con el certificado Let's Encrypt SSL en Ubuntu 18.04.
Requisitos
- Tiene los privilegios para abrir una sesión SSH en el servidor Ubuntu 18.04 ya sea usando un usuario raíz o usando un usuario habilitado para sudo.
- Ya ha instalado NGINX siguiendo nuestro tutorial desde aquí.
- Un nombre de dominio registrado.
- DNS Un registro que apunta a la dirección IP de su servidor según el nombre de dominio que desea usar.
Instalar la biblioteca cliente de Let's Encrypt
El primer paso que debe realizar es instalar la biblioteca de cliente Let's Encrypt que, a su vez, se utilizará para solicitar certificados de la autoridad LE. Una forma de hacerlo es clonando la biblioteca cliente de Let's Encrypt desde su repositorio oficial en su servidor.
También es posible instalar el mismo desde el repositorio oficial de Ubuntu. En el repositorio de Ubuntu, la biblioteca del cliente se conoce como certbot proporcionada por los desarrolladores de Let's Encrypt. Pero elegiremos el método anterior para instalarlo, es decir, clonando el repositorio de Github de Let's Encrypt.
Para hacer eso, navegue a la carpeta de instalación elegida y clone el repositorio. He elegido la carpeta de instalación como /usr/local
, puede elegir otra carpeta según su entorno.
# apt-get install git
# cd /usr/local
# git clone https://github.com/letsencrypt/letsencrypt
Cambie a la carpeta letsencrypt, encontrará todas las carpetas y archivos clonados, incluido el certbot que necesita Let's encrypt para obtener certificados para usted.
Lista Lets Encrypt Carpeta
Configura Let's Encrypt para verificar tu dominio
En el proceso de obtención de un certificado, el cliente de Let's Encrypt crea un archivo temporal en .well-known/acme-challenge
carpeta. Este archivo contiene un token para validar el hecho de que realmente posee el dominio para el que está intentando obtener los certificados. Recuerde que dicha carpeta se encuentra en la raíz web del dominio.
Por lo tanto, es imperativo que Let’s Encrypt pueda acceder al archivo temporal para verificar el dominio. Para otorgar acceso, debe configurar NGINX, ya que es el propietario de la raíz web del dominio. Agregue un bloque de ubicación específicamente para la carpeta /.well-known/acme-challenge
eso permitirá que Let's Encrypt coloque un token para la verificación del dominio. Para hacer eso, edite el archivo de configuración NGINX para su host virtual. No olvide ajustar la carpeta raíz según su entorno.
server {
listen 80;
server_name SUBDOMAIN.DOMAIN.TLD;
root /var/www/html/wordpress;
...
...
...
location /.well-known/acme-challenge {
allow all;
default_type "text/plain";
}
...
...
}
Verifique que el archivo de configuración sea sintácticamente correcto y reinicie NGINX:
# nginx -t
# systemctl restart nginx
Configurar cortafuegos UFW
Ubuntu 18.04 se envía con un administrador de firewall predeterminado UFW y, si ya lo ha habilitado y se está ejecutando en su servidor, no se permitirá que las conexiones HTTP o HTTPS lleguen al servidor NGINX.
También es posible que esté intentando instalar certificados en un servidor previamente configurado y las reglas del firewall ya estén presentes. Por supuesto, puede enumerar las reglas de firewall usando ufw status
comando en su servidor antes de continuar con la habilitación de las conexiones HTTP y HTTPS en su servidor Ubuntu 18.04.
Ejecute el siguiente conjunto de comandos en la terminal para permitir conexiones HTTP y HTTPS en su servidor.
# ufw status
# ufw allow http
# ufw allow https
# ufw reload
Solicite el certificado SSL de Let's Encrypt
Solicitamos un certificado SSL para el dominio elegido utilizando el cliente Let’s Encrypt que clonamos anteriormente. Aunque hay muchas opciones de configuración disponibles que se pueden usar con el script Let's Encrypt al solicitar un certificado, solo usaremos las siguientes opciones.
- ciertamente :esta opción le dice al script letsencrypt que obtenga solo el certificado SSL. Haremos la configuración de NGINX manualmente más tarde.
- raíz web :esta opción especifica el complemento webroot que se utilizará en el proceso de validación del nombre de dominio.
- ruta-webroot :esta opción establece la raíz del dominio y debe apuntar a la ubicación del sitio web que ha configurado en la configuración de NGINX.
- de acuerdo :Significa estar de acuerdo con los términos de servicio de Let's Encrypt.
- correo electrónico :el correo electrónico se usa para recibir un aviso de caducidad de Let's Encrypt, pero también se puede usar para recuperar la clave perdida.
- d :Esta opción especifica el nombre de dominio para el cual se solicitará el certificado.
Ahora combinando las opciones anteriores junto con el script del cliente letsencrypt, solicite un certificado usando los siguientes comandos:
# cd /usr/local/letsencrypt
# ./letsencrypt-auto certonly --agree-tos --email [email protected] --webroot --webroot-path /var/www/html/wordpress -d SUBDOMAIN.DOMAIN.TLD
Se obtuvo el certificado Lets Encrypt con éxito
El script Let's Encrypt le mostrará una pequeña nota una vez que los certificados SSL se hayan obtenido correctamente y los certificados se almacenarán en /etc/letsencrypt/live
carpeta.
Configurar NGINX para el certificado SSL Let's Encrypt
En esta etapa, la cadena de certificados de Let's Encrypt se ha guardado correctamente en su servidor. Ahora continúe con la configuración del archivo de host virtual para un servidor web NGINX seguro habilitado para SSL.
Generar clave Diffie-Hellman
Aunque el uso de la clave Diffie-Hellman es opcional al configurar los certificados Let's Encrypt con NGINX, se usa principalmente como un método para intercambiar claves criptográficas de forma segura para usar en el certificado Let's Encrypt.
# mkdir -p /etc/nginx/ssl
# cd /etc/nginx/ssl
# openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096
He colocado el archivo de parámetros DH en /etc/nginx/ssl
directorio simplemente por conveniencia. Puede colocar el archivo en otra ubicación.
Configurar parámetros SSL
A continuación, agregue parámetros para la conexión SSL como versiones de protocolo, conjuntos de cifrado, sesión, encabezados que su servidor debe admitir en un archivo separado.
Esto configurará un conjunto de cifrado sólido que habilita Forward Secrecy siempre que sea posible. Además, también habilitaremos HSTS y HPKP para fortalecer el servidor NGINX para conexiones SSL. Esto permitirá una configuración SSL sólida y preparada para el futuro para obtener una calificación A+ en la prueba SSL de Qualys Labs. .
# vi /etc/nginx/conf.d/ssl.conf
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
server_tokens off;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
#Online Certificate Status Protocol Stapling
ssl_stapling on;
ssl_stapling_verify on;
ssl_session_tickets off;
#HTTP Strict Transport Security
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
ssl_trusted_certificate /etc/letsencrypt/live/SUBDOMAIN.DOMAIN.TLD/chain.pem;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options nosniff;
add_header X-Robots-Tag none;
Editar servidor virtual NGINX
Finalmente, edite los bloques del servidor NGINX para su dominio elegido. Navegue a la ubicación predeterminada para los bloques del servidor NGINX que es /etc/nginx/sites-available
y edite el archivo de host virtual NGINX.
# vi /etc/nginx/sites-available/your_nginx_file.conf
server {
listen 80;
listen [::]:80;
server_name SUBDOMAIN.DOMAIN.TLD;
return 301 https://$host$request_uri;
}
...
...
El bloque de servidor anterior le indica a NGINX que escuche cualquier solicitud entrante en el puerto 80 para el dominio SUBDOMAIN.DOMAIN.TLD
y redirija el mismo a la sección https, cuya configuración se indica a continuación.
...
...
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
root /var/www/html/wordpress;
index index.html index.php index.htm;
server_name SUBDOMAIN.DOMAIN.TLD;
error_log /var/log/nginx/SUBDOMAIN.DOMAIN.TLD-error.log debug;
access_log /var/log/nginx/SUBDOMAIN.DOMAIN.TLD-access.log;
ssl_certificate /etc/letsencrypt/live/SUBDOMAIN.DOMAIN.TLD/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/SUBDOMAIN.DOMAIN.TLD/privkey.pem;
include /etc/nginx/conf.d/ssl.conf;
location /.well-known/acme-challenge {
allow all;
default_type "text/plain";
}
location / {
try_files $uri $uri/ =404;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
}
Compruebe el archivo de configuración para cualquier error sintáctico:
# nginx -t
Para activar el bloqueo del servidor, cree un enlace simbólico del archivo de configuración del host virtual anterior dentro de /etc/nginx/sites-enabled
carpeta.
# cd /etc/nginx/sites-enabled
# ln -s ../sites-available/your_nginx_file.conf .
Vuelva a cargar NGINX para aplicar nuevas configuraciones:
# systemctl reload nginx
Para analizar la configuración de los ajustes SSL anteriores, apunte su navegador a SSL Labs Test, escriba su nombre de dominio y haga clic en "Enviar". Espere un minuto para ver el resumen de la prueba. Una calificación A+ significa que hemos incluido la mayoría de las opciones de SSL en el proceso de protección del servidor NGINX.
Renovación automática del certificado Let's Encrypt
Los certificados de Let's Encrypt tienen una validez de 90 días. La razón de esto es limitar el daño del compromiso clave y fomentar la automatización.
Para automatizar el proceso de renovación de certificados, cree un cronjob usando crontab y agregue una línea de secuencia de comandos que se ejecutará una vez por semana para renovar los certificados cuando estén a punto de caducar.
# crontab -e
45 4 * * 6 cd /usr/local/letsencrypt/ && ./certbot-auto renew && systemctl restart nginx
El script de una sola línea anterior se ejecutará todos los sábados para verificar si los certificados están listos para la renovación y, de ser así, renovará los certificados y luego reiniciará el servidor NGINX.
Tenga en cuenta que no está completamente optimizado porque el servidor NGINX se reiniciará incluso si el certificado no se renueva. La mejor opción sería escribir un script personalizado para renovar el certificado SSL y reiniciar el servidor NGINX si los certificados se renuevan.
Conclusión
En este artículo, aprendimos cómo instalar la biblioteca cliente de Let’s Encrypt, solicitar un certificado para su dominio y cómo configurar los certificados SSL de Let’s Encrypt con NGINX. Además, un cronjob de ejemplo también le muestra cómo ocuparse del proceso de renovación del certificado con regularidad.