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

Introducción

Índice
  1. Introducción
  • Prerrequisitos
  • Paso 1: Creación del certificado SSL
  • Paso 2: Configuración de Nginx para utilizar SSL
    1. Creación de un fragmento de configuración que punte a la clave SSL y al certificado
    2. Creación de un fragmento de configuración con configuraciones de cifrado seguro
    3. Cómo ajustar la configuración de Nginx para utilizar SSL
  • Paso 3: Ajuste del firewall
  • Paso 4: Habilitar los cambios en Nginx
  • Paso 5: Prueba de cifrado
  • Paso 6: Cambiar a una redirección permanente
  • Conclusión
  • TLS , o seguridad de la capa de transporte, y su predecesor SSL , que significa capa de sockets seguros, 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 el servidor y los clientes sin la posibilidad de que los mensajes sean interceptados por terceros. El sistema de certificados también ayuda a los usuarios a verificar la identidad de los sitios a los que se conectan.

    En esta guía, le mostraremos cómo configurar un certificado SSL autofirmado para usar con un servidor web Nginx en un servidor Ubuntu 20.04.

    Nota: Un certificado autofirmado cifrará la comunicación entre su servidor y cualquier cliente. Sin embargo, dado que no está firmado por ninguna de las autoridades de certificación de confianza incluidas en los navegadores web, los usuarios no pueden utilizar el certificado para validar la identidad de su servidor automáticamente.

    Un certificado autofirmado puede ser adecuado si no tiene un nombre de dominio asociado a su servidor y para los casos en los que la interfaz web cifrada no está orientada al usuario. Si tiene un nombre de dominio, en muchos casos es mejor utilizar un certificado firmado por una CA. Puede averiguar cómo configurar un certificado de confianza gratuito con el proyecto Let's Encrypt.

    Prerrequisitos

    Antes de comenzar, debe tener un usuario no root configurado con sudoprivilegios y un firewall habilitado. Puede aprender a configurar una cuenta de usuario de este tipo siguiendo nuestra configuración inicial del servidor para Ubuntu 20.04.

    También necesitarás tener instalado el servidor web Nginx. Sigue nuestra guía sobre cómo instalar Nginx en Ubuntu 20.04. Asegúrate de completar el Paso 5 de este tutorial y configurar un bloque de servidor, ya que esto será necesario para probar si Nginx puede cifrar las conexiones usando tu certificado autofirmado.

    Si desea instalar una pila LEMP (Linux, Nginx, MySQL, PHP) completa en su servidor, puede seguir nuestra guía sobre cómo configurar LEMP en Ubuntu 20.04 en lugar de la guía de instalación independiente de Nginx.

    Paso 1: Creación del certificado SSL

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

    Puede crear un par de claves y certificados autofirmados con OpenSSL en un solo comando:

    1. 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 desglose de lo que hace cada parte de este comando:

    • sudo:El sudocomando permite a los miembros del sudogrupo elevar temporalmente sus privilegios a los de otro usuario (el superusuario o usuario raíz , de forma predeterminada). Esto es necesario en este caso, ya que estamos creando el certificado y el par de claves en el /etc/directorio, al que solo puede acceder el usuario raíz u otras cuentas privilegiadas.
    • openssl:Esta es la herramienta de línea de comandos básicos para crear y administrar certificados, claves y otros archivos OpenSSL.
    • req:Este subcomando especifica que queremos utilizar la gestión de solicitudes de firma de certificados (CSR) X.509. “X.509” es un estándar de infraestructura de clave pública que SSL y TLS respetan para la gestión de claves y certificados. Queremos crear un nuevo certificado X.509, por lo que utilizamos este subcomando.
    • -x509:Esto modifica aún más el subcomando anterior al indicarle a la utilidad que queremos crear un certificado autofirmado en lugar de generar una solicitud de firma de certificado, como sucedería normalmente.
    • -nodes:Esto le indica a OpenSSL que omita la opción de proteger nuestro certificado con una frase de contraseña. Necesitamos que Nginx pueda leer el archivo, sin la intervención del usuario, cuando se inicia el servidor. Una frase de contraseña evitaría que esto suceda porque tendríamos que ingresarla después de cada reinicio.
    • -days 365: Esta opción establece el período de tiempo durante el cual se considera válido el certificado. Aquí lo configuramos en un año.
    • -newkey rsa:2048: Esto especifica que queremos generar un nuevo certificado y una nueva clave al mismo tiempo. No creamos la clave que se requiere para firmar el certificado en un paso anterior, por lo que debemos crearla junto con el certificado. La rsa:2048parte le indica que cree una clave RSA de 2048 bits de longitud.
    • -keyout:Esta línea le dice a OpenSSL dónde colocar el archivo de clave privada generado que estamos creando.
    • -out:Esto le dice a OpenSSL dónde colocar el certificado que estamos creando.

    Como se indicó anteriormente, estas opciones crearán un archivo de clave y un certificado. Después de ejecutar este comando, se le harán algunas preguntas sobre su servidor para poder incorporar la información correctamente en el certificado.

    Complete las indicaciones de forma adecuada. La línea más importante es la que solicita el Common Name (e.g. server FQDN or YOUR name). Debe ingresar el nombre de dominio asociado con su servidor o, más probablemente, la dirección IP pública de su servidor.

    La totalidad de las indicaciones se verá así:

    OutputCountry Name (2 letter code) [AU]:USState or Province Name (full name) [Some-State]:New YorkLocality Name (eg, city) []:New York CityOrganization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc.Organizational Unit Name (eg, section) []:Ministry of Water SlidesCommon Name (e.g. server FQDN or YOUR name) []:server_IP_addressEmail Address []:admin@your_domain.com

    Ambos archivos que ha creado se colocarán en los subdirectorios apropiados del /etc/ssldirectorio.

    Al utilizar OpenSSL, también debe crear un grupo Diffie-Hellman (DH) sólido, que se utiliza para negociar la confidencialidad directa perfecta con los clientes.

    Puedes hacer esto escribiendo:

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

    Esto tomará un tiempo, pero cuando esté hecho tendrás un grupo DH fuerte /etc/nginx/dhparam.pemque se usará durante la configuración.

    Paso 2: Configuración de Nginx para utilizar SSL

    Ahora que se han creado los archivos de clave y certificado en el /etc/ssldirectorio, deberá modificar su configuración de Nginx para aprovecharlos.

    Primero, creará un fragmento de configuración con la información sobre la ubicación de los archivos de certificados y claves SSL. Luego, creará un fragmento de configuración con una configuración SSL segura que se pueda usar con cualquier certificado en el futuro. Por último, ajustará los bloques del servidor Nginx utilizando los dos fragmentos de configuración que ha creado para que las solicitudes SSL se puedan manejar de manera adecuada.

    Este método de configuración de Nginx le permitirá mantener limpios los bloques de servidor y colocar segmentos de configuración comunes en módulos reutilizables.

    Creación de un fragmento de configuración que punte a la clave SSL y al certificado

    Primero, use su editor de texto preferido para crear un nuevo fragmento de configuración de Nginx en el /etc/nginx/snippetsdirectorio. El siguiente ejemplo usa nano.

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

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

    En este archivo, debe establecer la ssl_certificatedirectiva para su archivo de certificado y la ssl_certificate_keyclave asociada. Esto se verá así:

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

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

    Cuando hayas añadido esas líneas, guarda el archivo y sal del editor. Si solías nanoeditar el archivo, puedes hacerlo presionando CTRL + X, Yy luego ENTER.

    Creación de un fragmento de configuración con configuraciones de cifrado seguro

    A continuación, creará otro fragmento que definirá algunos ajustes SSL. Esto configurará Nginx con un conjunto de cifrado SSL sólido y habilitará algunas funciones avanzadas que ayudarán a mantener seguro su servidor.

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

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

    Para configurar Nginx SSL de forma segura, adaptaremos las recomendaciones de Cipherlist.eu. Cipherlist.eu es un recurso útil y fácil de entender para comprender las configuraciones de cifrado que se utilizan en el software más popular.

    Nota : Estas configuraciones sugeridas de Cipherlist.eu ofrecen una seguridad sólida. A veces, esto se produce una costa de una mayor compatibilidad con el cliente. Si necesita brindar soporte a clientes más antiguos, existe una lista alternativa a la que puede acceder haciendo clic en el enlace de la página con la etiqueta “Sí, deme un conjunto de cifrado que funciona con software heredado/antiguo”. Si lo desea, puede sustituir esa lista con el contenido del siguiente bloque de código de ejemplo.

    La elección de la configuración que se utilizará dependerá en gran medida de lo que necesite admitir. Ambas proporcionarán una gran seguridad.

    Para sus propósitos, copie la configuración proporcionada en su totalidad, pero primero deberá realizar algunas pequeñas modificaciones.

    En primer lugar, agregue su solucionador de DNS preferido para las aplicaciones ascendentes. Usaremos ( 8.8.8.8y 8.8.4.4) de Google para esta guía.

    En segundo lugar, comente la línea que establece el encabezado de seguridad de transporte estricto. Antes de descubrir esta línea, debería tomarse un momento para leer sobre la seguridad de transporte estricto HTTP o HSTS, y específicamente sobre la funcionalidad de “precarga”. La precarga de HSTS proporciona mayor seguridad, pero también puede tener consecuencias negativas de gran alcance si se habilita accidentalmente o de manera incorrecta.

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

    /etc/nginx/snippets/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";

    Como estás usando un certificado autofirmado, no se usará el encuadernado SSL. Nginx mostrará una advertencia y deshabilitará el encuadernado para nuestro certificado autofirmado, pero luego seguirá funcionando correctamente.

    Guarde y cierre el archivo presionando CTRL + Xluego Yy ENTERcuando haya terminado.

    Cómo ajustar la configuración de Nginx para utilizar SSL

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

    En esta guía, asumiremos que está utilizando un archivo de configuración de bloque de servidor personalizado en el /etc/nginx/sites-availabledirectorio. Esta guía también sigue las convenciones del tutorial de requisitos previos de Nginx y las utiliza para este ejemplo. Sustituya el nombre del archivo de configuración según sea necesario./etc/nginx/sites-available/your_domain

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

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

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

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

    En el interior, el bloque de su servidor probablemente comienza de manera similar a lo siguiente:

    /etc/nginx/sitios-disponibles/su_dominio

    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;        }}

    Es posible que su archivo esté en un orden diferente y, en lugar de las rootdirectivas indexy, puede tener algunas locationu proxy_passotras declaraciones de configuración personalizadas. Esto está bien, ya que solo necesita actualizar las listendirectivas e incluir los fragmentos de SSL. Luego, modifique este bloque de servidor existente para que brinde tráfico SSL en el puerto 443y cree un nuevo bloque de servidor para responder en el puerto 80y redirigir automáticamente el tráfico al puerto 443.

    Nota: Utilice una redirección 302 hasta que haya verificado que todo funciona correctamente. Después, cambie esto a una redirección 301 permanente.

    En el archivo de configuración existente, actualice las dos listendeclaraciones para usar port 443y ssl, luego incluya los dos archivos de fragmentos que crearon en los pasos anteriores:

    /etc/nginx/sitios-disponibles/su_dominio

    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 del cierre de cierre ( }) del primer bloque:

    /etc/nginx/sitios-disponibles/tu_dominio.com

    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 80y realiza la redirección a HTTPS. Guarde y cierre el archivo presionando CTRL + Xy Ycuando ENTERhaya terminado de editarlo.

    Paso 3: Ajuste del firewall

    Si tiene el ufwfirewall habilitado, como lo recomienda la guía de requisitos anteriores, deberá ajustar la configuración para permitir el tráfico SSL. Afortunadamente, Nginx registra algunos perfiles al ufwmomento de la instalación.

    Puedes revisar los perfiles disponibles escribiendo:

    1. sudo ufw app list

    Aparecerá una lista como la siguiente:

    OutputAvailable applications:  Nginx Full  Nginx HTTP  Nginx HTTPS  OpenSSH

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

    1. sudo ufw status

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

    OutputStatus: activeTo                         Action      From--                         ------      ----OpenSSH                    ALLOW       AnywhereNginx HTTP                 ALLOW       AnywhereOpenSSH (v6)               ALLOW       Anywhere (v6)Nginx HTTP (v6)            ALLOW       Anywhere (v6)

    Para permitir el tráfico HTTPS, puede actualizar los permisos para el perfil “Nginx Full” y luego eliminar la asignación redundante del perfil “Nginx HTTP”:

    1. sudo ufw allow 'Nginx Full'
    2. sudo ufw delete allow 'Nginx HTTP'

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

    1. sudo ufw status
    OutputStatus: activeTo                         Action      From--                         ------      ----OpenSSH                    ALLOW       AnywhereNginx Full                 ALLOW       AnywhereOpenSSH (v6)               ALLOW       Anywhere (v6)Nginx Full (v6)            ALLOW       Anywhere (v6)

    Esta salida confirma que los ajustes a su firewall fueron exitosos y que está listo para habilitar los cambios en Nginx.

    Paso 4: Habilitar los cambios en Nginx

    Una vez completados los cambios y ajustes en su firewall, puede reiniciar Nginx para implementar los nuevos cambios.

    En primer lugar, compruebe que no haya errores de sintaxis en los archivos. Puede hacerlo escribiendo sudo nginx -t:

    1. sudo nginx -t

    Si todo sale bien obtendrás un resultado que dice lo siguiente:

    Outputnginx: [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 oknginx: configuration file /etc/nginx/nginx.conf test is successful

    Tenga en cuenta la advertencia que aparece al principio. Como se indicó anteriormente, esta configuración en particular genera una advertencia ya que su certificado autofirmado no puede utilizar el encuadernado SSL. Esto es normal y su servidor aún puede cifrar las conexiones correctamente.

    Si el resultado coincide con nuestro ejemplo, el archivo de configuración no tiene errores de sintaxis. Si este es el caso, puede reiniciar Nginx de manera segura para implementar los cambios:

    1. sudo systemctl restart nginx

    Ahora que el sistema se ha reiniciado con los nuevos cambios, puede proceder a realizar pruebas.

    Paso 5: Prueba de cifrado

    Ahora está listo para probar su servidor SSL.

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

    https://server_domain_or_IP

    Dependiendo de su navegador, es probable que reciba una advertencia ya que el certificado que creó no está firmado por una de las autoridades de certificación confiables de su navegador:

    Esta advertencia es esperada y normal. Solo nos interesa el aspecto de cifrado de nuestro certificado, no la validación de terceros de la autenticidad de nuestro servidor. Haga clic en “AVANZADO” y luego en el enlace proporcionado para continuar con su servidor:

    En este punto, deberías ser redirigido a tu sitio. En nuestro ejemplo, la barra de direcciones del navegador muestra un candado con una “x” encima, lo que significa que el certificado no se puede validar. Aún estás encriptando tu conexión. Ten en cuenta que este ícono puede variar según tu 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:

    http://server_domain_or_IP

    Si el resultado es el mismo icono, significa que la 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 cifrado tráfico, debe modificar la configuración de Nginx para que la redirección sea permanente.

    Abra nuevamente el archivo de configuración del bloque del servidor:

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

    Encuentralo return 302y cámbialo a return 301:

    /etc/nginx/sitios-disponibles/tu_dominio.com

    return 301 https://$server_name$request_uri;

    Guarde y cierre el archivo presionando CTRL + Xluego YyENTER

    Comprueba tu configuración en busca de errores de sintaxis:

    1. sudo nginx -t

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

    1. sudo systemctl restart nginx

    Después del reinicio, se implementarán los cambios y su redirección ahora será permanente.

    Conclusión

    Ha configurado su servidor Nginx para utilizar un cifrado fuerte para las conexiones de los clientes. Esto le permitirá atender solicitudes de forma segura y evitar que terceros se apoyen en su tráfico. Como alternativa, puede optar por utilizar un certificado SSL autofirmado que se puede obtener de Let's Encrypt, una autoridad de certificación que instala certificados TLS/SSL gratuitos y habilita el cifrado HTTPS en servidores web. Obtenga más información en nuestro tutorial sobre Cómo proteger Nginx con Let's Encrypt en Ubuntu 20.04.

    SUSCRÍBETE A NUESTRO BOLETÍN 
    No te pierdas de nuestro contenido ni de ninguna de nuestras guías para que puedas avanzar en los juegos que más te gustan.

    Deja una respuesta

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

    Subir

    Este sitio web utiliza cookies para mejorar tu experiencia mientras navegas por él. Este sitio web utiliza cookies para mejorar tu experiencia de usuario. Al continuar navegando, aceptas su uso. Mas informacion