Cómo configurar Nginx para usar un certificado SSL / TLS autofirmado en Ubuntu 18.04 VPS o un servidor dedicado |

SSL (Secure Sockets Layer) y TLS (Transport Layer Security) son protocolos web que se utilizan para proteger el tráfico de datos normal envolviéndolos en forma cifrada.
Esta tecnología cuenta con un sistema de certificados que permite la comunicación privada entre servidores y clientes. Crea una ruta segura para que los servidores envíen tráfico a los clientes sin que otras partes alteren la información.
En este tutorial, lo guiaremos a través del proceso de creación de un certificado SSL / TLS autofirmado y su uso en Nginx. En este caso, estamos usando el servidor Ubuntu 18.04.
Antes de comenzar, necesitará lo siguiente:
Ahora profundicemos en el proceso.
Al implementar certificados SSL / TLS, se utilizan certificados públicos y una clave privada. El certificado SSL es un documento público que se comparte con los clientes que solicitan el contenido. Por otro lado, la clave SSL se utiliza para cifrar los mensajes enviados a los clientes y debe mantenerse en secreto en su servidor.
Ejecute el siguiente comando para crear un certificado y una clave autofirmada mediante SSL:
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/example.com.key -out /etc/ssl/certs/example.com.crt
Abre: Esta herramienta de línea de comandos se utiliza para generar y administrar el certificado OpenSSL, las claves y otros archivos.
Req.: Este es un subcomando que indica que se debe utilizar la gestión de solicitud de firma de certificado (CSR) X.509. X.509 es el estándar de infraestructura para claves públicas al que se adhieren TLS y SSL para la gestión de claves y certificados. En nuestro caso estamos generando un nuevo certificado X.509 y por esta razón estamos usando req.
-x509: Esto cambia el subcomando req. Informa a la utilidad que estamos creando un certificado autofirmado en lugar de generar una CSR.
-Nodo: Esto le dice a OpenSSL que no proteja el certificado con una frase de contraseña. Una frase de contraseña evita que Nginx lea nuestro archivo cuando se inicia el servidor.
Días 365: Esto define la duración de la validez del certificado.
-nuevo clave rsa: 2048: Este es un comando que dice que estamos generando una nueva clave y un nuevo certificado al mismo tiempo. Rsa: 2048 Indica al servicio que genere una clave RSA de 2048 bits.
-keyout: Esta es una línea que le dice a OpenSSL que guarde la clave privada que creó.
-fuera: La línea le dice a OpenSSL dónde guardar el certificado creado.
Después del comando anterior, se le pedirá que responda algunas preguntas sobre el certificado que desea generar.
Léalos atentamente y dé las respuestas correctas para completar el proceso. La línea importante de esta sección requiere el nombre común, como SU nombre o el nombre de dominio completo (FQDN) del servidor. En este caso, ingrese su nombre de dominio o la dirección IP pública asignada al servidor. .
Debería tener la salida a continuación:
OutputIT CountryName (2 lettercode) [AU]:US StateorProvinceName (fullname) [Some-State]:New York LocalityName (eg, city) [ ]:New YorkCity OrganizationName (eg, company) [Internet Widgits Pty Ltd]::Example Company OrganizationalUnitName (eg, section) [ ]:SSL Unit CommonName (e.g. serverFQDNorYOURname) [ ]:server_IP_address EmailAddress [ ]:admin@your_domain.com
Una vez que haya terminado, los dos archivos se guardarán en los subdirectorios correctos en el / etc / ssl Directorio.
Necesitará estos archivos como referencia en los ajustes de configuración de Nginx. También es importante crear un grupo DH (Diffie-Hellman) fuerte, que es esencial para negociar el secreto hacia adelante con los clientes.
Para hacer esto, ejecute el siguiente comando:
$ sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096
Este proceso puede llevar un tiempo, pero una vez que esté hecho, su grupo DH (Diffie-Hellman) se guardará en /etc/nginx/dhparam.pem, que se puede usar en la configuración de Nginx.
Como ya hemos creado el certificado, la clave y los archivos, podemos configurar Nginx con estos ajustes.
Sin embargo, antes de hacer eso, debemos hacer algunos ajustes en nuestra configuración para dividir las secciones comunes en unidades reutilizables.
Primero, cree un fragmento de la configuración de Nginx en el / etc / nginx / snippets Directorio. Llamaremos a este archivo self-signing.conf.
$ sudo nano /etc/nginx/snippets/self-signed.conf
Ahora configure el ssl_certificate en el archivo asociado y ssl_certificate_key a su clave asociada. Esto le da el siguiente resultado:
/etc/nginx/snippets/self-signed.conf ssl_certificate /et##c/ssl/certs/nginx-selfsigned.crt; ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
Luego guarde y salga del archivo.
El siguiente paso es crear un fragmento adicional con una configuración de cifrado SSL sólida. Esto permite otras funciones adicionales para proteger su servidor.
En este caso elegiremos un nombre genérico como se muestra a continuación:
$ sudo nano /etc/nginx/snippets/ssl-params.conf
Para garantizar que Nginx SSL esté configurado de forma segura, utilizamos el formato del sitio web Cipherli.st, que contiene pautas de cifrado fáciles de usar para software popular.
En este tutorial, vamos a copiar la configuración proporcionada por este sitio, pero cambiaremos algunas líneas.
En este caso, estamos agregando nuestro solucionador de DNS para varias necesidades ascendentes. Además, comentaremos la línea que es responsable del encabezado de seguridad de transporte.
Copie y pegue los siguientes detalles en su archivo de fragmentos llamado ssl-params.conf.
ssl_protocols TLSv1.2; ssl_prefer_server_cipherson; ssl_dhparam /etc/nginx/dhparam.pem; 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; ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0 ssl_session_timeout 10m; ssl_session_cache shared:SSL:10m; ssl_session_ticketsoff; # Requires nginx >= 1.5.9 ssl_staplingon; # Requires nginx >= 1.3.7 ssl_stapling_verifyon; # Requires nginx => 1.3.7 resolver8.8.8.88.8.4.4 valid=300s; resolver_timeout5s; # 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 solo usamos un certificado autofirmado, no es necesario incluir el grapado SSL. Nginx desactivará automáticamente el grapado y seguirá funcionando correctamente.
Ahora guarde y salga del archivo.
Cuando haya terminado con los fragmentos, ajuste la configuración de Nginx para permitir SSL.
En este ejemplo, usamos /etc/nginx/sites-available/example.com. Reemplace el nombre del archivo en su configuración con el que desee.
Sin embargo, comience haciendo una copia de seguridad del archivo de configuración actual:
$ sudo cp /etc/nginx/sites-available/example.com /etc/nginx/sites-available/example.com.bak
Abra su archivo y ajuste la línea apropiada como se muestra a continuación:
$ sudo nano /etc/nginx/sites-available/example.com
Verá una salida como esta:
/etc/nginx/sites-available/example.com server { listen 80; listen [::]:80; server_name example.com www.example.com; root /var/www/example.com/html; index index.html index.htm index.nginx-debian.html; . . . }
Puede encontrar varias instrucciones de configuración que incluyen secciones como: raíz y índice puede aparecer como Ubicación, proxy_passu otras configuraciones. Es importante tener en cuenta que está bien tener estas instrucciones. Solo tienes que actualizar el escuchar Instrucciones y contienen los fragmentos de SSL.
En su archivo de configuración actual, actualice las instrucciones de la lista para el tráfico SSL del servidor en el puerto 443 y SSL. También agregue los archivos de fragmentos que creó en los dos pasos anteriores::
/etc/nginx/sites-available/example.com server { listen 443 ssl; listen [::]:443 ssl; include snippets/self-signed.conf; include snippets/ssl-params.conf; server_name example.com www.example.com; root /var/www/example.com/html; index index.html index.htm index.nginx-debian.html; . . . }
Después del corchete de cierre (}) del bloque de arriba, agregue otro bloque de servidor al suyo Archivo de configuración:
/etc/nginx/sites-available/example.com . . . server { listen80; listen [::]:80; server_name example.com www.example.com; return302 https://$server_name$request_uri; }
La configuración anterior monitorea el puerto 80 y no solo redirige a HTTP.
Una vez que haya terminado, guarde y salga del archivo.
Si el firewall ufw está activado, debe ajustar la configuración del sistema para permitir el tráfico de datos a través de SSL.
Una vez completada la instalación, Nginx registra varios perfiles con ufw.
Puede ver estos perfiles ejecutando el siguiente comando:
$ sudo ufw app list
Verá una salida como esta:
Available applications: Nginx Full Nginx HTTP Nginx HTTPS OpenSSH
Ejecute el siguiente comando para ver qué configuración está habilitada:
$ sudo ufw status
Debería tener un resultado como este para mostrar que su servidor web solo permite tráfico HTTP:
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 garantizar que el tráfico HTTPS fluya sin problemas, habilite el perfil “Nginx completo” y elimine el perfil HTTP Nginx redundante:
$ sudo ufw allow 'Nginx Full' $ sudo ufw delete allow 'Nginx HTTP'
Su salida debería verse así:
$ sudo ufw status
producción
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6)
Después de realizar los ajustes en el firewall, reinicie el servicio Nginx para que los cambios surtan efecto.
Además, asegúrese de que no haya errores en sus archivos. Para hacer esto, ejecute el siguiente comando:
$ sudo nginx -t
Si todo funciona correctamente, debería obtener el siguiente resultado:
nginx: [warn] "ssl_stapling" ignored, issuer certificate not found nginx: the configuration file /etc/nginx/nginx.confsyntax is ok nginx: configuration file /etc/nginx/nginx.conftest is successful
Ahora reinicie nginx para que los cambios surtan efecto:
$ sudo systemctl restart nginx
A continuación, pruebe que el cifrado SSL funcione.
Ingrese el prefijo http: // en su navegador y luego su nombre de dominio:
https: // dominio_servidor
Dado que el certificado aún no está firmado por una autoridad de certificación confiable, lo más probable es que reciba una advertencia como la siguiente:
Es posible que vea una advertencia que aparece porque el certificado SSL creado anteriormente no fue firmado por una autoridad de certificación confiable:
No se preocupe si ve este mensaje, es normal. La función de cifrado del certificado es importante. Seleccione la opción Avanzado y el enlace a continuación para ir al host.
Serás redirigido a tu sitio web. En la barra de su navegador, puede ver lo que parece un candado con un ícono “X” sobre eso. Esto significa que el certificado aún no se ha validado y el cifrado aún no se ha completado.
Para verificar que el reenvío de contenido HTTP funciona correctamente, ingrese lo siguiente:
http: // dominio_servidor_o_IP
Si los resultados del icono de candado son los mismos, significa que la redirección está funcionando correctamente.
Si está seguro de que solo desea permitir el tráfico cifrado, es importante cambiar la configuración de Nginx para crear una redirección permanente.
Utilice el siguiente comando para abrir el archivo de configuración del bloque del servidor:
$ sudo nano /etc/nginx/sites-available/example.com
Busque la devolución 302 y reemplácela con la devolución 301:
return301 https://$server_name$request_uri;
Guarda los cambios y cierra el archivo
A continuación, verifique la configuración para detectar posibles errores de sintaxis usando el siguiente comando:
$ sudo nginx -t
Reinicie Nginx para completar los cambios:
$ sudo systemctl restart nginx
¡Ahí tienes! Ha configurado correctamente Nginx para utilizar el certificado SSL / TLS. Esta es una forma segura de permitir solicitudes de clientes y evitar que otras partes accedan a su tráfico.