Cómo crear un certificado SSL autofirmado para Nginx en Ubuntu

0 acciones
0
0
0
0

Introducción

TLS, o Transport Layer Security, y su predecesor SSL, que significa Secure Sockets Layer, son protocolos web utilizados para proteger y cifrar el tráfico a través de una red informática.

Con TLS/SSL, los servidores pueden enviar tráfico de forma segura entre ellos y los clientes sin que terceros puedan interceptar los mensajes. El sistema de certificados también ayuda a los usuarios a verificar la identidad de los sitios con los que interactúan.

En esta guía, configurará un certificado SSL autofirmado para usar con un servidor web Nginx en un servidor Ubuntu.

Requisitos previos
  • Antes de comenzar, debe tener un usuario no root configurado con privilegios de sudo y un firewall habilitado.
  • También es necesario instalar el servidor web Nginx.
  • Si desea instalar una pila LEMP completa (Linux, Nginx, MySQL, PHP) en su servidor.

Paso 1: Crear un certificado TLS

TLS/SSL funciona con una combinación de un certificado público y una clave privada. La clave SSL se mantiene en secreto en el servidor y cifra el contenido enviado a los clientes. El certificado SSL se comparte públicamente con cualquier persona que solicite el contenido. Puede utilizarse para descifrar el contenido firmado por la clave SSL asociada.

Puede generar un par de claves autofirmadas y un certificado con OpenSSL en un solo comando:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt

A continuación se muestra un resumen de lo que hace cada parte de este comando:

  • sudoEl comando sudo permite a los miembros del grupo sudo elevar temporalmente sus privilegios a otro usuario (por defecto, el superusuario o el usuario root). Esto es necesario en este caso porque estamos creando un certificado y un par de claves en el directorio /etc/ al que solo puede acceder el usuario root u otras cuentas con privilegios.
  • openssl:Esta es la herramienta principal de línea de comandos para crear y administrar certificados, claves y otros archivos OpenSSL.
  • pedidoEste subcomando especifica que queremos usar la gestión de solicitudes de firma de certificado (CSR) X.509. “X.509” es un estándar de infraestructura de clave pública que SSL y TLS cumplen para la gestión de claves y certificados. Queremos crear un nuevo certificado X.509, por lo que usamos este subcomando.
  • x509:Esto modifica el subcomando anterior al indicar que queremos crear un certificado autofirmado en lugar de crear una solicitud de firma de certificado, como suele ser el caso.
  • nodosEsto le indica a OpenSSL que omita la opción de proteger nuestro certificado con una contraseña. Necesitamos que Nginx pueda leer el archivo sin la intervención del usuario al iniciar el servidor. Una contraseña impide que esto suceda, ya que debemos ingresarla después de cada reinicio.
  • -días 365Esta opción determina el período de validez del certificado. Aquí lo configuramos en un año.
  • -nueva clave rsa:2048: Especifica que queremos generar un nuevo certificado y una nueva clave simultáneamente. No creamos la clave necesaria para firmar el certificado en el paso anterior, por lo que debemos crearla junto con el certificado. La parte rsa:2048 indica que se debe crear una clave RSA con una longitud de 2048 bits.
  • -keyout:Esta línea le dice a OpenSSL dónde colocar el archivo de clave privada generado que estamos creando.
  • -afuera:Esto le dice a OpenSSL dónde colocar el certificado que estamos creando.

Como se mencionó anteriormente, estas opciones crean un archivo de clave y un certificado. Tras ejecutar este comando, se le harán algunas preguntas sobre su servidor para integrar correctamente la información en el certificado.

Complete los comandos correctamente. La línea más importante es la que solicita el nombre compartido (es decir, el FQDN del servidor o su nombre). Deberá ingresar el nombre de dominio asociado a su servidor o, probablemente, su dirección IP pública.

El comando completo será el siguiente:

Output
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc.
Organizational Unit Name (eg, section) []:Ministry of Water Slides
Common Name (e.g. server FQDN or YOUR name) []:server_IP_address
Email Address []:admin@your_domain.com

Ambos archivos que usted creó se colocarán en los subdirectorios apropiados del directorio /etc/ssl.

Al utilizar OpenSSL, también debe crear un grupo Diffie-Hellman (DH) sólido, que utilice confidencialidad total hacia adelante al negociar con los clientes.

Puedes hacerlo escribiendo:

sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096

Esto tomará un tiempo, pero una vez hecho, tendrás un grupo DH fuerte en /etc/nginx/dhparam.pem que se usará durante la configuración.

Paso 2: Configurar Nginx para usar SSL

Ahora que los archivos de clave y certificado se han creado en el directorio /etc/ssl, necesita modificar su configuración de Nginx para usarlos.

Primero, creará un fragmento de configuración con información sobre la ubicación de la clave SSL y el archivo del certificado. A continuación, creará un fragmento de configuración con una configuración SSL robusta que pueda usarse con cualquier certificado futuro. Finalmente, configurará los bloques de su servidor Nginx usando los dos fragmentos de configuración que creó para que las solicitudes SSL se gestionen correctamente.

Este método de configuración de Nginx le permite mantener limpios los bloques del servidor y colocar secciones de configuración comunes en módulos reutilizables.

Cree un fragmento de configuración que apunte a la clave SSL y al certificado

Primero, usa tu editor de texto favorito para crear un nuevo fragmento de configuración de Nginx en la carpeta /etc/nginx/snippets. El siguiente ejemplo usa nano.

Para identificar correctamente el propósito de este archivo, nómbrelo self-signed.conf:

sudo nano /etc/nginx/snippets/self-signed.conf

En este archivo, debe configurar la directiva ssl_certificate para el archivo del certificado y la directiva ssl_certificate_key para la clave asociada. Se verá así:

ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;

Una vez agregadas esas líneas, guarda el archivo y sal del editor. Si usaste nano para editarlo, puedes hacerlo presionando CTRL + X, Y y luego ENTER.

Cree un fragmento de configuración con configuraciones de cifrado seguras

A continuación, crea otra pieza que define algunos ajustes de SSL. Esto configura Nginx con un conjunto de cifrado SSL robusto y habilita funciones avanzadas que ayudan a mantener la seguridad de tu servidor.

Los parámetros que configure se pueden reutilizar en futuras configuraciones de Nginx, por lo que puede darle al archivo un nombre genérico:

sudo nano /etc/nginx/snippets/ssl-params.conf

Para configurar Nginx SSL de forma segura, adaptamos las recomendaciones de Cipherlist.eu. Cipherlist.eu es un recurso útil y fácil de entender para comprender la configuración de cifrado utilizada en software popular.

Para sus propósitos, copie exactamente la configuración proporcionada, pero primero deberá realizar algunos pequeños cambios.

Primero, agrega tu solucionador DNS preferido para las solicitudes ascendentes. Usaremos Google (8.8.8.8 y 8.8.4.4) para esta guía.

En segundo lugar, comente la línea que especifica el encabezado Strict Transport Security. Antes de descomentar esta línea, le recomendamos leer sobre la Seguridad de Transporte Estricta HTTP (HSTS), y en concreto sobre la función de precarga. La precarga de HSTS proporciona seguridad adicional, pero también puede tener consecuencias negativas generalizadas si se activa accidental o incorrectamente.

Agregue lo siguiente a su archivo de fragmento ssl-params.conf:

ssl_protocols TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/dhparam.pem; 
ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
ssl_ecdh_curve secp384r1;
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable strict transport security for now. You can uncomment the following
# line if you understand the implications.
#add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";

Dado que utiliza un certificado autofirmado, no se utilizará el grapado SSL. Nginx mostrará una advertencia y desactivará el grapado para nuestro certificado firmado, pero seguirá funcionando correctamente.

Cuando haya terminado, guarde y cierre el archivo presionando CTRL + X y luego Y y ENTER.

Configuración de Nginx para usar SSL

Ahora que tienes tus piezas, puedes ajustar la configuración de Nginx para habilitar SSL.

Esta guía asume que está utilizando un archivo de configuración de bloque de servidor personalizado en el directorio /etc/nginx/sites-available. Esta guía también sigue las convenciones del tutorial de prerrequisitos de Nginx y utiliza /etc/nginx/sites-available/your_domain para este ejemplo. Sustituya el nombre de su archivo de configuración si es necesario.

Antes de continuar, haga una copia de seguridad de su archivo de configuración actual:

sudo cp /etc/nginx/sites-available/your_domain /etc/nginx/sites-available/your_domain.bak

Ahora abra el archivo de configuración para realizar los ajustes:

sudo nano /etc/nginx/sites-available/your_domain

Internamente, su bloque de servidor probablemente comenzará de manera similar a lo siguiente:

server {
listen 80;
listen [::]:80;
root /var/www/your_domain/html;
index index.html index.htm index.nginx-debian.html;
server_name your_domain www.your_domain;
location / {
try_files $uri $uri/ =404;
}
}

Tu archivo podría estar en un orden diferente y, en lugar de directivas de raíz y directorio, podrías tener directivas de ubicación, proxy_pass u otras directivas de configuración personalizadas. Esto es correcto, ya que solo necesitas actualizar las directivas de escucha y agregar los componentes SSL. Luego, modifica este bloque de servidor existente para atender el tráfico SSL en el puerto 443 y crea un nuevo bloque de servidor para escuchar en el puerto 80 y redirigir automáticamente el tráfico al puerto 443.

En el archivo de configuración existente, actualice las dos declaraciones de escucha para usar el puerto 443 y SSL, luego agregue los dos archivos de fragmentos que creó en los pasos anteriores:

server {
listen 443 ssl;
listen [::]:443 ssl;
include snippets/self-signed.conf;
include snippets/ssl-params.conf;
root /var/www/your_domain/html;
index index.html index.htm index.nginx-debian.html;
server_name your_domain.com www.your_domain.com;
location / {
try_files $uri $uri/ =404;
}
}

A continuación, agregue un segundo bloque de servidor al archivo de configuración después de la llave de cierre (}) del primer bloque:

server {
listen 80;
listen [::]:80;
server_name your_domain.com www.your_domain.com;
return 302 https://$server_name$request_uri;
}

Esta es una configuración básica que escucha en el puerto 80 y redirige a HTTPS. Al terminar de editar, guarde y cierre el archivo presionando CTRL + X, luego Y y ENTER.

Paso 3 – Configurar el firewall

Si ha habilitado el firewall ufw, como se recomienda en la guía de prerrequisitos, deberá ajustar la configuración para permitir el tráfico SSL. Afortunadamente, Nginx registra algunos perfiles con ufw al instalarlo.

Puede explorar los perfiles disponibles escribiendo:

sudo ufw app list

Aparecerá una lista como la que aparece a continuación:

Output
Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH

Puede comprobar la configuración actual escribiendo sudo ufw status:

sudo ufw status

Probablemente producirá la siguiente respuesta, lo que significa que solo se permite el tráfico HTTP al servidor web:

Output
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)

Para permitir el tráfico HTTPS, puede actualizar los permisos del perfil "Nginx Full" y luego eliminar el permiso adicional "Nginx HTTP":

sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'

Después de ejecutar sudo ufw status, debería obtener el siguiente resultado:

sudo ufw status
Output
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx Full (v6) ALLOW Anywhere (v6)

Esta salida confirma que la configuración de su firewall se ha completado correctamente y está listo para habilitar los cambios en Nginx.

Paso 4 – Habilitar los cambios en Nginx

Una vez que haya completado los cambios y configuraciones del firewall, puede reiniciar Nginx para aplicar los nuevos cambios.

Primero, verifique que no haya errores de sintaxis en los archivos. Puede hacerlo escribiendo sudo nginx -t:

sudo nginx -t

Si todo sale bien, recibirás un resultado parecido a esto:

Output
nginx: [warn] "ssl_stapling" ignored, issuer certificate not found for certificate "/etc/ssl/certs/nginx-selfsigned.crt"
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Tenga en cuenta la advertencia inicial. Como se mencionó anteriormente, esta configuración generará una advertencia porque su certificado firmado no puede usar cifrado SSL. Esto es normal y su servidor podrá cifrar las conexiones correctamente.

Si el resultado coincide con nuestro ejemplo, su archivo de configuración no tiene errores de sintaxis. En ese caso, puede reiniciar Nginx sin problemas para aplicar los cambios:

sudo systemctl restart nginx

Ahora que el sistema se ha reiniciado con los nuevos cambios, puedes continuar con las pruebas.

Paso 5 – Prueba del cifrado

Ahora, está listo para probar su servidor SSL.

Abra su navegador web y escriba https:// seguido del nombre de dominio o la dirección IP de su servidor en la barra de direcciones:

Dependiendo de su navegador, es posible que reciba una advertencia porque el certificado creado no fue firmado por una de las autoridades de certificación de confianza de su navegador:


Esta advertencia es normal y esperada. Solo nos interesa el cifrado de nuestro certificado, no la verificación externa de las credenciales de su host. Haga clic en "Avanzado" y luego en el enlace para acceder a su host:


En este punto, debería ser redirigido a su sitio web. En nuestro ejemplo, la barra de direcciones del navegador mostrará un candado con una "x", lo que significa que el certificado no se puede verificar. Su conexión seguirá cifrada. Tenga en cuenta que este icono puede variar según su navegador.

Si ha configurado Nginx con dos bloques de servidor, redirigiendo automáticamente el contenido HTTP a HTTPS, también puede comprobar si la redirección funciona correctamente:

Si el resultado es el mismo ícono, significa que tu redirección funcionó correctamente.

Paso 6 – Cambiar a una redirección permanente

Si su redirección funcionó correctamente y está seguro de que desea permitir solo tráfico cifrado, deberá cambiar la configuración de Nginx para que la redirección sea permanente.

Vuelva a abrir el archivo de configuración del bloque de servidor:

sudo nano /etc/nginx/sites-available/your_domain

Encuentra la redirección 302 y cámbiala a una redirección 301:

 return 301 https://$server_name$request_uri;

Guarde y cierre el archivo presionando CTRL + X, luego Y y ENTER.

Comprueba tu configuración para detectar errores de sintaxis:

sudo nginx -t

Cuando esté listo, reinicie Nginx para que la redirección sea permanente:

sudo systemctl restart nginx

Después de reiniciar, los cambios tendrán efecto y su redirección ahora será permanente.

Resultado

Ha configurado su servidor Nginx para usar un cifrado robusto para las conexiones de los clientes. Esto le permite atender las solicitudes de forma segura y evitar que terceros lean su tráfico. Como alternativa, puede usar un certificado SSL autofirmado que puede obtener de Let's Encrypt, una autoridad de certificación que instala certificados TLS/SSL gratuitos y habilita HTTPS cifrado en servidores web.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

También te puede gustar