Cómo instalar Nginx con Let’s encrypt y obtener un A+ en el test de SSLLabs
En este tutorial, te mostraré paso a paso cómo instalar y configurar el servidor web Nginx con el certificado Letsencrypt. Esta guía te informará sobre la instalación del servidor web Nginx, la instalación de la herramienta let’s encrypt, la generación del certificado SSL lets encrypt, la configuración del host virtual nginx con SSL y la creación de una configuración SSL adicional para obtener la A+ del test SSL Labs.
Requisitos previos
- Servidor Linux – Ubuntu 18.04 o CentOS 7.5
- Privilegios de root
¿Qué vamos a hacer?
- Instalar el servidor web Nginx
- Configurar el Firewall UFW/Firewalld
- Instalar let’s encrypt y generar el certificado SSL
- Configurar el SSL seguro
- Configurar el host virtual Nginx con SSL
- Probar
Paso 1 – Instalar el servidor web Nginx
En este tutorial, te guiaremos para instalar y configurar el servidor web Nginx con Letsencrypt en ambos servidores Linux – Ubuntu 18.04 y CentOS 7.5.
En Ubuntu 18.04
Actualiza el repositorio y luego instala nginx con el comando apt que aparece a continuación.
sudo apt update
sudo apt install nginx -y
En CentOS 7.5.
Instala el repositorio EPEL en el sistema CentOS e instala Nginx utilizando el comando yum.
sudo yum install epel-release -y
sudo yum install nginx -y
Una vez completada la instalación, inicia el servicio Nginx y habilítalo para que se lance cada vez que se inicie el sistema.
systemctl start nginx
systemctl enable nginx
El servidor web Nginx ya está instalado y se ejecuta en el puerto HTTP 80 por defecto. Compruébalo con el comando netstat que aparece a continuación.
netstat -plntu
Paso 2 – Configurar el cortafuegos UFW – Firewalld
Se recomienda activar el Firewall en el servidor y abrir el puerto específico que sea necesario. En este paso, mostraremos cómo abrir los puertos SSH, HTTP y HTTPS en los servidores Linux Ubuntu 18.04 utilizando el cortafuegos UFW, y Firewalld en el sistema CentOS 7.5.
En Ubuntu 18.04 – Firewall UFW
Antes de habilitar el UFW Firewall en el sistema Ubuntu, asegúrate de que el puerto SSH está habilitado en la lista de configuración del firewall.
Añade el puerto del servicio SSH a la configuración del cortafuegos utilizando el comando ufw y luego habilita el servicio del cortafuegos UFW.
ufw allow ssh
ufw enable
Ahora añade los servicios HTTP y HTTPS.
ufw allow http
ufw allow https
Los puertos de los servicios SSH, HTTP y HTTPS se han añadido a la lista de servicios del cortafuegos UFW, compruébalo con el siguiente comando.
ufw status
En CentOS 7.5 – Firewalld
Antes de añadir el puerto y los servicios al firewelld, asegúrate de que el servicio firewalld está en funcionamiento.
Inicia el servicio firewalld y habilítalo para que se inicie cada vez al arrancar el sistema.
systemctl start firewalld
systemctl enable firewalld
Nota:
- El servicio SSH estará habilitado por defecto en la lista de servicios de Firewald.
Ahora añade los servicios HTTP y HTTPS utilizando el comando firewall-cmd que aparece a continuación.
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
Recarga la configuración de firewalld y comprueba la lista de servicios.
firewall-cmd --reload
firewall-cmd --list-services
Y tendrás los servicios SSH, HTTP y HTTPS en la lista.
Paso 3 – Instalar Letsencrypt y generar certificados
En este paso, instalaremos la herramienta letsencrypt, y generaremos los certificados SSL fuertes Letsencrypt utilizando el comando cerbot.
En Ubuntu 18.04
Instala los paquetes letsencrypt utilizando el comando apt que aparece a continuación.
sudo apt install letsencrypt -y
En CentOS 7.5
Ahora instala los paquetes letsencrypt en CentOS 7 usando el comando yum de abajo.
sudo yum install certbot -y
Una vez completada la instalación, crearemos una nueva configuración que se utilizará para generar archivos de certificados SSL.
En Ubuntu 18.04
Ve al directorio de configuración ‘/etc/nginx’ y crea un nuevo archivo de configuración ‘cerbot.conf’ en el directorio ‘snippets’.
cd /etc/nginx/
vim snippets/certbot.conf
Pega allí la siguiente configuración.
location /.well-known { alias /var/www/html/.well-known; }
Guarda y sal.
Ahora edita el archivo de host virtual de Nginx por defecto.
vim sites-available/default
Añade la siguiente configuración bajo los bloques ‘servidor {..}’.
include snippets/certbot.conf;
Guarda y sal.
En CentOS 7.5
Ve al directorio de configuración ‘/etc/nginx’ y crea un nuevo archivo de configuración ‘certbot.conf’ en el directorio ‘default.d’.
cd /etc/nginx/
vim default.d/certbot.conf
Pega la configuración de abajo.
location /.well-known { alias /usr/share/nginx/html/.well-known; }
Guarda y sal.
Ahora prueba la configuración de nginx y asegúrate de que no hay ningún error, luego reinicia el servicio nginx.
nginx -t
systemctl restart nginx
A continuación, genera los certificados SSL letsencrypt utilizando el comando certbot.
En Ubuntu 18.04
certbot certonly --rsa-key-size 4096 --webroot --agree-tos --no-eff-email --email [email protected] -w /var/www/html -d hakase-labs.io
En CentOS 7.5
certbot certonly --rsa-key-size 4096 --webroot --agree-tos --no-eff-email --email [email protected] -w /usr/share/nginx/html -d hakase-labs.io
Nota:
- Especificaremos el tamaño de la clave RSA para nuestro dominio en ‘4096’, y definiremos el método de autenticación en el directorio raíz web por defecto ‘/var/www/html’ en el sistema Ubuntu, y en el directorio ‘/usr/share/nginx/html’ para el sistema CentOS 7.
Cuando se haya completado, obtendrás todos los archivos de certificados SSL para el nombre de dominio en el directorio ‘/etc/letsencrypt/live’.
Para obtener una seguridad adicional, generaremos la clave DHPARAM ‘4096’ utilizando el comando OpenSSL como se muestra a continuación.
openssl dhparam -out /etc/nginx/dhparam.pem 4096
La clave DHPARAM se ha generado en el directorio ‘/etc/nginx’.
Paso 4 – Configuración SSL
En este paso, definiremos la configuración SSL para el servidor web Nginx. Crearemos una nueva configuración ‘ssl.conf’ que contenga una configuración SSL ajustada y enfocada a la seguridad para el servidor web Nginx.
En Ubuntu 18.04
Ve al directorio de configuración ‘/etc/nginx/’ y crea una nueva configuración SSL ‘ssl.conf’ en el directorio ‘snippets’.
cd /etc/nginx/
vim snippets/ssl.conf
En CentOS 7.5
Ve al directorio de configuración ‘/etc/nginx/’ y crea una nueva configuración SSL ‘ssl/conf’ en el directorio ‘default.d’.
cd /etc/nginx/
vim default.d/ssl.conf
Pega allí la siguiente configuración SSL.
# Specify the TLS versions ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; # Ciphersuites recommendation from the chiper.li # Use this chipersuites to get 100 points of the SSLabs test # Some device will not support #ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384"; # Mozilla Ciphersuits Recommendation # Use this for all devices supports ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256'; # Use the DHPARAM key and ECDH curve >= 256bit ssl_ecdh_curve secp384r1; ssl_dhparam /etc/nginx/dhparam.pem; server_tokens off; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; # Enable HTTP Strict-Transport-Security # If you have a subdomain of your site, # be carefull to use the 'includeSubdomains' options add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; # Enable OSCP Stapling for Nginx web server # If you're using the SSL from Letsencrypt, # use the 'chain.pem' certificate ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/letsencrypt/live/hakase-labs.io/chain.pem; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; # XSS Protection for Nginx web server 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;
Guarda y sal.
Nota:
- Especifica las versiones TLS para el sitio, sólo acepta la TLSv1 TLSv1.1 TLSv1.2.
- Especifica el cifrado SSL, y se recomienda utilizar el cifrado SSL de la sugerencia de Mozilla para conseguir la compatibilidad de todos los dispositivos.
- Activa HSTS, OSCP Stapling y añade la protección XSS.
Paso 5 – Configurar el host virtual Nginx con SSL
En este paso, crearemos un archivo de host virtual para el nombre de dominio. Crearemos un nuevo host virtual, un dominio llamado hakase-labs.io, y su directorio raíz web se ubicará en el directorio ‘/var/www/site01’.
Crea el nuevo directorio ‘/var/www/site01’ y crea el archivo ‘index.html’ dentro.
mkdir -p /var/www/site01
echo '<h1><center>Nginx - Letsencrypt - A+</center></h1>' > /var/www/site01/index.html
Ahora ve al directorio de configuración ‘/etc/nginx’ y crea un nuevo archivo de host virtual llamado ‘hakase-labs.io’ para ubuntu, y ‘hakase-labs.conf’ para el sistema CentOS 7.
En Ubuntu 18.04
cd /etc/nginx/
vim sites-available/hakase-labs.io
En CentOS 7.5
cd /etc/nginx/
vim conf.d/hakase-labs.conf
Pega allí la siguiente configuración de host virtual Nginx de ejemplo.
server { listen 80; listen [::]:80; server_name hakase-labs.io; return 301 https://$host$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; root /var/www/site01; index index.html index.php index.htm; server_name hakase-labs.io; error_log /var/log/nginx/hakase-error.log warn; ssl_certificate /etc/letsencrypt/live/hakase-labs.io/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/hakase-labs.io/privkey.pem; #SSL Configuration include snippets/ssl.conf; location ~ /.well-known { allow all; } 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; } }
Guarda y sal.
Nota:
- Cambia la línea ‘include snippets/ssl.conf;’. Si utilizas Ubuntu, déjala por defecto. Y si usas CentOS, cambia el directorio a ‘default.d/ssl.conf’
Sólo en el sistema Ubuntu
Habilita el nuevo archivo de host virtual y prueba la configuración, y asegúrate de que no hay ningún error.
ln -s /etc/nginx/sites-available/hakase-labs.io /etc/nginx/sites-enabled/
nginx -t
Ahora reinicia el servicio nginx.
systemctl restart nginx
Se ha creado el nuevo host virtual con el HTTPS activado y una configuración SSL adicional.
Comprueba con el comando netstat y verás el puerto 443 de HTTPS en la lista.
netstat -plntu
Paso 6 – Prueba
Abre tu navegador web y escribe el nombre de tu dominio, el mío es ‘http://hakase-labs.io’.
Y serás redirigido a la conexión HTTPS.
Ahora ve al sitio de pruebas SSL‘https://www.ssllabs.com/ssltest/’ y escribe tu propio nombre de dominio, luego espera a obtener los resultados.
A continuación se muestra mi resultado al utilizar la «Recomendación de cifrado de Mozilla».
Y el siguiente es el resultado de utilizar la «Recomendación de Cipher.li».
Verás que todos los resultados son «A+», y sólo difieren en la «Fuerza del Cifrado» en las recomendaciones de Mozilla y en la Recomendación de Cipherli.st.
Para comprobar el OSCP Stapling y el HSTS en el servidor, desplaza la página de resultados de la prueba y obtendrás el resultado que se muestra a continuación.
Si quieres comprobar el OSCP Stapling desde la línea de comandos, compruébalo utilizando el siguiente comando.
echo QUIT | openssl s_client -connect hakase-labs.io:443 -status 2> /dev/null | grep -A 17 'OCSP response:' | grep -B 17 'Next Update'
Para comprobar el HSTS, compruébalo utilizando el siguiente comando curl.
curl -s -D- https://hakase-labs.io | grep -i Strict
La instalación y configuración del servidor web Nginx con SSL Letsencrypt, así como la obtención de la A+ de la prueba SSLabs se han completado con éxito.