Cómo crear y usar SSL autofirmado en Nginx – CloudSavvy IT

Logotipo de Nginx

Si solo necesita encriptación para conexiones de servidor interno o sitios que no están orientados al usuario, firmar sus propios certificados SSL es una manera fácil de evitar tener que lidiar con una autoridad de certificación externa. Aquí se explica cómo configurarlo en nginx.

Si está más interesado en obtener certificados SSL gratuitos, siempre puede usar LetsEncrypt, que es más adecuado para servidores públicos con sitios web orientados al usuario porque aparecerá como proveniente de una autoridad de certificación reconocida en los navegadores de los usuarios. Sin embargo, no se puede utilizar para cifrar direcciones IP privadas, por lo que debe firmar un certificado usted mismo.

Genere y autofirme un certificado SSL

Para hacer esto, usaremos el openssl utilidad. Es probable que ya lo tenga instalado, ya que es una dependencia de Nginx. Pero si de alguna manera falta, puede instalarlo desde el administrador de paquetes de su distribución. Para sistemas basados ​​en Debian como Ubuntu, eso sería:

sudo apt-get install openssl

Después openssl está instalado, puede generar el certificado con el siguiente comando:

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

Se le pedirá información sobre su organización. Debido a que está autofirmado, lo único que realmente importa es el «Nombre común», que debe configurarse con el nombre de su dominio o la dirección IP de su servidor.

Country Name (2 letter code) []:
State or Province Name (full name) []:
Locality Name (eg, city) []:
Organization Name (eg, company) []:
Organizational Unit Name (eg, section) []:
Common Name (eg, fully qualified host name) []: your_ip_address
Email Address []:

Esto tomará un segundo para generar una nueva clave privada RSA, usada para firmar el certificado, y almacenarlo en /etc/ssl/private/nginx.key. El certificado en sí se almacena en /etc/ssl/certs/nginx.crt, y es válido por un año completo.

También queremos generar un grupo Diffie-Hellman. Esto se utiliza para un secreto directo perfecto, que genera claves de sesión efímeras para garantizar que las comunicaciones pasadas no se puedan descifrar si la clave de sesión está comprometida. Esto no es del todo necesario para las comunicaciones internas, pero si desea estar lo más seguro posible, no debe omitir este paso.

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

Esto lleva un tiempo, aproximadamente una hora, dependiendo de la velocidad de su servidor. Tome un almuerzo y regrese a su terminal en un momento para configurar Nginx.

RELACIONADOS: ¿Qué es un archivo PEM y cómo se usa?

Configure Nginx para usar su clave privada y certificado SSL

Para facilitar las cosas, pondremos toda la configuración en un archivo de fragmentos que podemos incluir en nuestro nginx server bloques. Cree un nuevo fragmento de configuración en nginx’s snippets directorio:

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

Ábralo en su editor de texto favorito y pegue lo siguiente en:

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

ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;
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_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;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";

ssl_dhparam /etc/nginx/dhparam.pem;
ssl_ecdh_curve secp384r1;

Las dos primeras líneas de este fragmento configuran nginx para usar nuestro certificado hecho por nosotros mismos y nuestra propia clave privada. El siguiente bloque es la configuración general de SSL y, finalmente, las dos últimas líneas configuran nginx para usar nuestro grupo Diffie-Hellman para seguridad avanzada. Puede omitir esto si no tiene ganas de esperar.

La única otra cosa para habilitar sería HTTP Strict Transport Security, que configura su sitio para usar siempre SSL. Esto requeriría una redirección permanente de HTTP a HTTPS, por lo que debe verificar que SSL funcione antes de habilitarlo.

Ahora, modifique su configuración principal de nginx (generalmente ubicada en /etc/nginx/nginx.conf para sitios únicos o bajo su nombre de dominio en /etc/nginx/sites-available para servidores de varios sitios) y obtenga el fragmento:

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    include snippets/self-signed.conf;

    server_name example.com www.example.com;
    . . .
}

También querrá configurar una redirección de HTTP a HTTPS, lo que puede hacer con un bloque de servidor adicional escuchando en el puerto 80:

server {
    listen 80;
    listen [::]:80;

    server_name example.com www.example.com;

    return 302 https://$server_name$request_uri;
}

Esta es una redirección 302, que es solo temporal. Querrá cambiar esto a 301 si todo funciona correctamente.

Pruebe su configuración reiniciando nginx:

sudo service nginx restart

Debido a que el tráfico HTTPS usa el puerto 443, deberá configurar sus firewalls para permitir el transporte a través de ese puerto. Si estas usando iptables o UFW, deberá abrir los puertos desde la línea de comandos. Si está utilizando un servicio de alojamiento como AWS que tiene un firewall integrado, también deberá abrirlos desde su interfaz web.

Interfaz de firewall de AWS

Si su servicio funciona completamente dentro de su LAN, es posible que desee incluir en la lista blanca su subred específica de direcciones IP para deshabilitar el acceso desde fuera de la LAN y acceder a sus servidores a través de una conexión VPN.

Si todo funciona correctamente, ahora debería poder acceder a su servidor a través de HTTPS. Su navegador web puede mostrar una advertencia como esta:

advertencia SSL de Chrome

No se preocupe, esto es lo esperado y la razón por la que no puede usar estos certificados para sitios web orientados al cliente. Deberá confirmar manualmente que confía en el servidor para poder acceder a él.

La advertencia que se muestra aquí es un poco engañosa: su sitio es seguro siempre que la clave privada no se vea comprometida, y es perfectamente seguro si configura el secreto directo Diffie-Hellman. El problema radica en la identidad, ya que Chrome no puede verificar que su servidor sea quien dice ser, porque usted mismo firmó el certificado.

Una vez que haya verificado que no hay problemas con SSL, puede cambiar la redirección HTTP a una redirección 301:

return 301 https://$server_name$request_uri;

Y reinicie nginx para aplicar los cambios.

Deja un comentario

En esta web usamos cookies para personalizar tu experiencia de usuario.    Política de cookies
Privacidad