TLS 1.3 no funciona en nginx 1.21 con openssl 1.1.1n

TLS 1.3 no funciona en nginx 1.21 con openssl 1.1.1n

Tengo nginx (1.21.6) ejecutándose con openssl 1.1.1n en un servidor Debian 11. Aunque seguí muchos tutoriales y revisé varias preguntas en este foro sobre este tema, no puedo hacer que TLS 1.3 funcione. La salida de nginx -V:

nginx version: nginx/1.21.6
built by gcc 10.2.1 20210110 (Debian 10.2.1-6)
built with OpenSSL 1.1.1k  25 Mar 2021 (running with OpenSSL 1.1.1n  15 Mar 2022)
TLS SNI support enable

Actualicé nginx a la versión principal porque no pude hacer que TLS 1.3 funcionara también en versiones anteriores. Es muy extraño... Openssl definitivamente es compatible con TLS 1.3. Lo probé openssl s_client -tls1_3 -connect www.cloudflare.com:443y funcionó bien. Aquí mi ssl.confarchivo de nginx que incluí en cada uno de mis servidores nginx (los certificados se incluyen por separado en las secciones del servidor):

ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;  # about 40000 sessions
ssl_session_tickets off;

ssl_stapling on;
#ssl_trusted_certificate /pfad/bundle.ca.pem;
ssl_stapling_verify on;

ssl_dhparam /etc/nginx/dhparams.pem;

ssl_ecdh_curve X448:secp521r1:secp384r1;


ssl_protocols TLSv1.3 TLSv1.2;
ssl_ciphers TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-AES-128-GCM-SHA256:TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:TLS-AES-128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on;

# HSTS (ngx_http_headers_module is required) (63072000 seconds)
add_header Strict-Transport-Security "max-age=31536000;preload;includeSubDomains" always;

ElQualys ssltest de mis sitiosSin embargo, no muestra que uso TLS 1.3 en mi servidor. Además, el navegador Chrome muestra que se conecta mediante TLS 1.2. Incluso si elimino la TLSv1.2directiva de mi ssl.confy la dejo solo TLSv1.3, todavía se conecta a través de TLS 1.2.

No hay ninguna ssl_protocolsdirectiva en ningún otro archivo de configuración de nginx. Lo comprobé vía nginx -T.

Realmente se me están acabando las ideas... ¿Alguien puede ayudarme?

EDITAR: De alguna manera, nginx no parece reaccionar correctamente a ssl_protocolsla directiva y ssl_ecdh_curve. Por ejemplo, cuando elimino ssl_ciphersde mi configuración (como sugirió @drookie en su comentario), TLS 1.0 y TLS 1.1 parecen ser compatibles con mi servidor aunque configuréssl_protocols TLSv1.3 TLSv1.2; . Del mismo modo, segúnprueba de calidad, secp256r1es compatible, aunque no tengo esta curva en mi configuración de ssl_ecdh_curve(ni prime256v1). Me parece como si algo sobrescribiera mi configuración en el ssl.confarchivo. Estoy usando acme.sh para obtener mis certificados. grep -R 'ssl_protocol' /etc/*solo da la línea ssl.confcon ssl_protocols TLSv1.3 TLSv1.2;. No tengo idea de qué podría causar la interferencia/sobrescritura...

Respuesta1

Después de muchas pruebas y mucha lectura, finalmente encontré una solución. Tuve que escribir la configuración ssl en el httpbloque, no en los serverbloques de mi configuración de nginx. Sin embargo, esto funcionó solo si copio las directivas de mi ssl.confarchivo explícitamente al httpbloque en mi nginx.conf(de lo contrario, nginx -tgenera

nginx: [emerg] invalid number of arguments in "include" directive in /etc/nginx/nginx.conf:33
nginx: configuration file /etc/nginx/nginx.conf test failed

por alguna razón).

De ahí que mi httpbloque de nginx.conflooks ahora sea el siguiente:

http {

  ...
 
    ssl_dhparam /etc/nginx/dhparams.pem;
    
    ssl_ecdh_curve X448:secp521r1:secp384r1;
    
    ssl_protocols TLSv1.3 TLSv1.2;
   ssl_ciphers 'TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';

   ...

    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

No sé por qué estas configuraciones SSL deben incluirse/pegarse en el httpbloque en lugar de en cada serverbloque... ¡Pero funciona y TLS 1.3 está habilitado!

información relacionada