Cómo crear un certificado SSL autofirmado para Nginx en CentOS 7

Introducción

Índice
  1. Introducción
  • Prerrequisitos
  • Paso 1: Crear el certificado SSL
  • Paso 2: Configurar Nginx para utilizar SSL
    1. Crear el bloque de servidor TLS/SSL
    2. Crear una redirección de HTTP a HTTPS (opcional)
  • Paso 3: Habilitar los cambios en Nginx
  • Paso 4: prueba de cifrado
  • 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 envolver el tráfico normal en un contenedor protegido y cifrado.

    Con esta tecnología, los servidores pueden enviar tráfico de forma segura entre el servidor y los clientes sin 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, configurará un certificado SSL autofirmado para usar con un servidor web Nginx en un servidor CentOS 7.

    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. Como resultado, los usuarios verán un error de seguridad al visitar su sitio.

    Debido a esta limitación, los certificados autofirmados no son apropiados para un entorno de producción que brinde servicios al público. Por lo general, se utilizan para realizar pruebas o para proteger servicios no críticos utilizados por un solo usuario o un pequeño grupo de usuarios que pueden confiar en la validez del certificado a través de canales de comunicación alternativos.

    Para obtener una solución de certificado más preparada para la producción, consulte Let’s Encrypt , una autoridad de certificación gratuita. Puede aprender a descargar y configurar un certificado Let’s Encrypt en nuestro tutorial sobre cómo configurar Nginx con un certificado Let’s Encrypt en CentOS 7 .

    Prerrequisitos

    Para completar este tutorial, debes tener lo siguiente:

    • Un servidor CentOS con un usuario no root configurado con sudoprivilegios como se describe en el tutorial de configuración inicial del servidor para CentOS 7 .
    • Nginx instalado en el servidor, como se describe en Cómo instalar Nginx en CentOS 7 .

    Cuando esté listo para comenzar, inicie sesión en su servidor como su sudousuario.

    Paso 1: Crear el 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 se utiliza para cifrar el contenido enviado a los clientes. El certificado SSL se comparte públicamente con cualquier persona que solicite el contenido y se puede utilizar para descifrar el contenido firmado por la clave SSL asociada.

    El /etc/ssl/certsdirectorio que se puede utilizar para almacenar el certificado público ya debería existir en el servidor. También deberá crear un /etc/ssl/privatedirectorio para almacenar el archivo de clave privada. Dado que la confidencialidad de esta clave es esencial para la seguridad, es importante bloquear los permisos para evitar el acceso no autorizado:

    1. sudo mkdir /etc/ssl/private
    2. sudo chmod 700 /etc/ssl/private

    Ahora, puedes crear un par de clave y certificado autofirmado con OpenSSL en un solo comando escribiendo:

    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

    Se le harán una serie de preguntas. Antes de analizarlas, veamos qué sucede en el comando:

    • openssl : esta es la herramienta de línea de comandos básica para crear y administrar certificados, claves y otros archivos OpenSSL.
    • req : este subcomando especifica que desea 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. Desea crear un nuevo certificado X.509, por lo que está utilizando este subcomando.
    • -x509 : Esto modifica aún más el subcomando anterior al indicarle a la utilidad que desea 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 su certificado con una frase de contraseña. Necesita 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ía que ingresarla después de cada reinicio.
    • -days 365 : esta opción establece el período de tiempo durante el cual se considerará válido el certificado. Aquí se establece en un año.
    • -newkey rsa:2048 : especifica que desea generar un nuevo certificado y una nueva clave al mismo tiempo. No creó la clave necesaria para firmar el certificado en un paso anterior, por lo que debe crearla junto con el certificado. Esta rsa:2048parte le indica que cree una clave RSA de 2048 bits de longitud.
    • -keyout : esta línea le indica a OpenSSL dónde colocar el archivo de clave privada generado que está creando.
    • -out : Esto le indica a OpenSSL dónde colocar el certificado que está creando.

    Como se indicó anteriormente, estas opciones crearán un archivo de clave y un certificado. 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 la dirección IP pública de su servidor.

    La totalidad de las indicaciones se verá así:

    OutputCountry Name (2 letter code) [XX]:USState or Province Name (full name) []:ExampleLocality Name (eg, city) [Default City]:Example Organization Name (eg, company) [Default Company Ltd]:Example IncOrganizational Unit Name (eg, section) []:Example DeptCommon Name (eg, your name or your server's hostname) []:your_domain_or_ipEmail Address []:webmaster@example.com

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

    Como está utilizando OpenSSL, también debe crear un grupo Diffie-Hellman sólido, que se utiliza para negociar la confidencialidad perfecta hacia adelante con los clientes.

    Puedes hacer esto escribiendo:

    1. sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

    Esto puede tomar unos minutos, pero cuando esté hecho tendrás un grupo DH fuerte /etc/ssl/certs/dhparam.pemque podrás usar en tu configuración.

    Paso 2: Configurar Nginx para utilizar SSL

    La configuración predeterminada de Nginx en CentOS no tiene mucha estructura, ya que el bloque de servidor HTTP predeterminado se encuentra dentro del archivo de configuración principal. Nginx buscará archivos que terminen en .confel /etc/nginx/conf.ddirectorio para realizar una configuración adicional.

    Creará un nuevo archivo en este directorio para configurar un bloque de servidor que proporcione contenido utilizando los archivos de certificado que generó. Luego, puede configurar opcionalmente el bloque de servidor predeterminado para redirigir las solicitudes HTTP a HTTPS.

    Crear el bloque de servidor TLS/SSL

    Crea y abre un archivo llamado ssl.confen el /etc/nginx/conf.ddirectorio:

    1. sudo vi /etc/nginx/conf.d/ssl.conf

    En el interior, comience abriendo un serverbloque. De forma predeterminada, las conexiones TLS/SSL utilizan el puerto 443, por lo que ese debería ser su listenpuerto. server_nameDebe configurarse con el nombre de dominio o la dirección IP del servidor que utilizó como nombre común al generar su certificado. A continuación, utilice las directivas ssl_certificate, ssl_certificate_keyy ssl_dhparampara configurar la ubicación de los archivos SSL que generó:

    /etc/nginx/conf.d/ssl.conf

    server {    listen 443 http2 ssl;    listen [::]:443 http2 ssl;    server_name your_server_ip;    ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;    ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;    ssl_dhparam /etc/ssl/certs/dhparam.pem;}

    A continuación, agregará algunas opciones SSL adicionales que aumentarán la seguridad de su sitio. Las opciones que utilizará son recomendaciones de Cipherlist.eu . Este sitio está diseñado para proporcionar configuraciones de cifrado fáciles de usar para software popular.

    Nota: Las configuraciones predeterminadas sugeridas en Cipherlist.eu ofrecen una seguridad sólida. A veces, esto se produce a costa de una mayor compatibilidad con los clientes. Si necesita brindar soporte a clientes más antiguos, existe una lista alternativa a la que puede acceder haciendo clic en el enlace etiquetado como “Sí, deme un conjunto de cifrado que funcione con software heredado/antiguo”.

    La lista de compatibilidad se puede utilizar en lugar de las sugerencias predeterminadas en la configuración anterior entre los dos bloques de comentarios. La elección de la configuración que utilice dependerá en gran medida de lo que necesite admitir.

    Hay algunas partes de la configuración que quizás desees modificar. Primero, puedes agregar a la resolverdirectiva tu solucionador DNS preferido para solicitudes ascendentes. Usaste el de Google para esta guía, pero puedes cambiarlo si tienes otras preferencias.

    Por último, deberías tomarte un momento para leer sobre HTTP Strict Transport Security, o HSTS , y específicamente sobre la funcionalidad de “precarga” . La precarga de HSTS proporciona mayor seguridad, pero puede tener consecuencias de gran alcance si se habilita accidentalmente o de manera incorrecta. En esta guía, no precargarás la configuración, pero puedes modificarla si estás seguro de comprender las implicaciones.

    /etc/nginx/conf.d/ssl.conf

    server {    listen 443 http2 ssl;    listen [::]:443 http2 ssl;    server_name your_server_ip;    ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;    ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;    ssl_dhparam /etc/ssl/certs/dhparam.pem;    ########################################################################    # from https://cipherlist.eu/                                            #    ########################################################################        ssl_protocols TLSv1.3;# Requires nginx = 1.13.0 else use TLSv1.2    ssl_prefer_server_ciphers on;    ssl_ciphers EECDH+AESGCM:EDH+AESGCM;    ssl_ecdh_curve secp384r1; # Requires nginx = 1.1.0    ssl_session_timeout  10m;    ssl_session_cache shared:SSL:10m;    ssl_session_tickets off; # Requires nginx = 1.5.9    ssl_stapling on; # Requires nginx = 1.3.7    ssl_stapling_verify on; # Requires nginx = 1.3.7    resolver 8.8.8.8 8.8.4.4 valid=300s;    resolver_timeout 5s;    # Disable preloading HSTS for now.  You can use the commented out header line that includes    # the "preload" directive 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";    ##################################    # END https://cipherlist.eu/ BLOCK #    ##################################}

    Como está utilizando un certificado autofirmado, no se utilizará el encuadernado SSL. Nginx simplemente mostrará una advertencia, deshabilitará el encuadernado para su certificado autofirmado y seguirá funcionando correctamente.

    Por último, agregue el resto de la configuración de Nginx para su sitio. Esto variará según sus necesidades. Solo deberá copiar algunas de las directivas utilizadas en el bloque de ubicación predeterminada para su ejemplo, que establecerá la raíz del documento y algunas páginas de error:

    /etc/nginx/conf.d/ssl.conf

    server {    listen 443 http2 ssl;    listen [::]:443 http2 ssl;    server_name your_server_ip;    ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;    ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;    ssl_dhparam /etc/ssl/certs/dhparam.pem;    ########################################################################    # from https://cipherlist.eu/                                            #    ########################################################################        . . .        ##################################    # END https://cipherlist.eu/ BLOCK #    ##################################    root /usr/share/nginx/html;    location / {    }    error_page 404 /404.html;    location = /404.html {    }    error_page 500 502 503 504 /50x.html;    location = /50x.html {    }}

    Cuando haya terminado, guarde y salga. Esto configura Nginx para que use el certificado SSL generado para cifrar el tráfico. Las opciones SSL especificadas garantizan que solo se utilizarán los protocolos y cifrados más seguros. Tenga en cuenta que esta configuración de ejemplo simplemente muestra la página Nginx predeterminada, por lo que es posible que desee modificarla para satisfacer sus necesidades.

    Crear una redirección de HTTP a HTTPS (opcional)

    Con su configuración actual, Nginx responde con contenido cifrado a las solicitudes en el puerto 443, pero responde con contenido no cifrado a las solicitudes en el puerto 80. Esto significa que su sitio ofrece cifrado, pero no exige su uso. Esto puede ser adecuado para algunos casos de uso, pero suele ser mejor exigir el cifrado. Esto es especialmente importante cuando se pueden transferir datos confidenciales, como contraseñas, entre el navegador y el servidor.

    Afortunadamente, el archivo de configuración predeterminado de Nginx nos permite agregar directivas fácilmente al bloque de servidor del puerto 80 predeterminado. Puede hacerlo insertando esto al comienzo de ssl.conf:

    /etc/nginx/conf.d/ssl.conf

    server {    listen 80;    listen [::]:80;    server_name your_server_ip;    return 301 https://$host$request_uri;}. . .

    Guarde y cierre el archivo cuando haya terminado. Esto configura el bloque de servidor HTTP en el puerto 80 (predeterminado) para redirigir las solicitudes entrantes al bloque de servidor HTTPS que configuró.

    Paso 3: Habilitar los cambios en Nginx

    Ahora que ha realizado los cambios, puede reiniciar Nginx para implementar su nueva configuración.

    En primer lugar, debe comprobar que no haya errores de sintaxis en los archivos de configuración. Puede hacerlo escribiendo:

    1. sudo nginx -t

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

    Outputnginx: [warn] "ssl_stapling" ignored, issuer certificate not foundnginx: 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 un certificado autofirmado no puede utilizar el encuadernado SSL. Esto es lo esperado y su servidor aún puede cifrar las conexiones correctamente.

    Si el resultado coincide con lo anterior, el archivo de configuración no tiene errores de sintaxis. Puede reiniciar Nginx de manera segura para implementar los cambios:

    1. sudo systemctl restart nginx

    El proceso Nginx se reiniciará, implementando la configuración SSL que usted configuró.

    Paso 4: 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

    Debido a que el certificado que creó no está firmado por una de las autoridades de certificación confiables de su navegador, es probable que vea una advertencia de aspecto aterrador como la que se muestra a continuación:

    Esto es normal y esperado. Solo le interesa el aspecto de cifrado de su certificado, no la validación de terceros de la autenticidad de su servidor. Haga clic en “AVANZADO” y luego en el enlace proporcionado para continuar con su servidor de todos modos:

    Deberías ser redirigido a tu sitio. Si miras la barra de direcciones del navegador, verás alguna indicación de seguridad parcial. Puede ser un candado con una “x” encima o un triángulo con un signo de exclamación. En este caso, esto solo significa que el certificado no se puede validar. Sigue cifrando tu conexión.

    Si configuraste Nginx para redirigir las solicitudes HTTP a HTTPS, también puedes verificar 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.

    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 lean su tráfico.

    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