I’m going nuts here to trying to figure out how to enable TLSv1.3 on my nginx server.

Based on my research, my setup should support it:

# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.4 LTS Release: 18.04 Codename: bionic # uname -a Linux server 5.3.0-28-generic #30~18.04.1-Ubuntu SMP Fri Jan 17 06:14:09 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux # nginx -V nginx version: nginx/1.14.0 (Ubuntu) built with OpenSSL 1.1.1 11 Sep 2018 TLS SNI support enabled ... # openssl version OpenSSL 1.1.1 11 Sep 2018 # dpkg -s openssl | grep Version Version: 1.1.1-1ubuntu2.1~18.04.5 

I have included the TLSv1.3 protocol and even (tho’ I understand it is optional) specifically listed the TLSv1.3 ciphers in my nginx config:

... ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256; ssl_ecdh_curve X25519:secp384r1; ... 

But I can’t connect to the server using TLSv1.3, whether by browser (which can connect to other websites via TLSv1.3) or curl:

# curl -I -v --tlsv1.3 --tls-max 1.3 * Rebuilt URL to: * Trying xxx.xxx.xxx.xxx... * TCP_NODELAY set * Connected to mydomain.com (xxx.xxx.xxx.xxx) port 443 (#0) * ALPN, offering h2 * ALPN, offering http/1.1 * successfully set certificate verify locations: * CAfile: /etc/ssl/certs/ca-certificates.crt CApath: /etc/ssl/certs * TLSv1.3 (OUT), TLS handshake, Client hello (1): * TLSv1.3 (IN), TLS alert, Server hello (2): * error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version * stopped the pause stream! * Closing connection 0 curl: (35) error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version 

TLSv1.2 works fine.

What I am missing please?!


EDIT

Some additional troubleshooting information:

# openssl s_client -tls1_3 -connect mydomain.com:443 CONNECTED(00000005) 140179247497664:error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version:../ssl/record/rec_layer_s3.c:1528:SSL alert number 70 --- no peer certificate available --- No client certificate CA names sent --- SSL handshake has read 7 bytes and written 244 bytes Verification: OK --- New, (NONE), Cipher is (NONE) Secure Renegotiation IS NOT supported Compression: NONE Expansion: NONE No ALPN negotiated Early data was not sent Verify return code: 0 (ok) --- 

Again, I have no issue when running this with TLSv1.2 as the option.

0

2 Answers

I've solved my issue. I had a default_server config also included in /etc/nginx/sites-enabled/, which didn't have the TLSv1.3 flag in the ssl_protocols parameter (in fact, it didn't have a ssl_protocols parameter at all). This apparently caused the failure, even though my tests were run on hostnames that were served by different server blocks. Go figure!

1

Hi I tried answering on other thread however for whatever reason I couldn't.

I tried your test on my own server(s) however I'm getting this:

curl -I -v --tlsv1.3 --tls-max 1.3 * Trying 10.0.1.86:443... * TCP_NODELAY set * Connected to bw.domain.com (10.0.1.86) port 443 (#0) * ALPN, offering http/1.1 * successfully set certificate verify locations: * CAfile: /opt/local/share/curl/curl-ca-bundle.crt CApath: none * TLSv1.3 (OUT), TLS handshake, Client hello (1): * TLSv1.3 (IN), TLS handshake, Server hello (2): * TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8): * TLSv1.3 (IN), TLS handshake, Certificate (11): * TLSv1.3 (IN), TLS handshake, CERT verify (15): * TLSv1.3 (IN), TLS handshake, Finished (20): * TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1): * TLSv1.3 (OUT), TLS handshake, Finished (20): * SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 * ALPN, server accepted to use http/1.1 * Server certificate: * subject: CN=bw.domain.com * start date: Feb 3 16:54:01 2020 GMT * expire date: May 3 16:54:01 2020 GMT * subjectAltName: host "bw.domain.com" matched cert's "bw.domain.com" * issuer: C=US; O=Let's Encrypt; CN=Let's Encrypt Authority X3 * SSL certificate verify ok. > HEAD / HTTP/1.1 > Host: bw.domain.com > User-Agent: curl/7.68.0 > Accept: */* > * TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): * TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): * old SSL session ID is stale, removing * Mark bundle as not supporting multiuse < HTTP/1.1 200 OK HTTP/1.1 200 OK < Server: nginx/1.16.1 Server: nginx/1.16.1 < Date: Wed, 19 Feb 2020 15:23:50 GMT Date: Wed, 19 Feb 2020 15:23:50 GMT < Content-Type: text/html; charset=utf-8 Content-Type: text/html; charset=utf-8 < Content-Length: 1373 Content-Length: 1373 < Connection: keep-alive Connection: keep-alive < Cache-Control: public, max-age=600 Cache-Control: public, max-age=600 < Feature-Policy: accelerometer 'none'; ambient-light-sensor 'none'; autoplay 'none'; camera 'none'; encrypted-media 'none'; fullscreen 'none'; geolocation 'none'; gyroscope 'none'; magnetometer 'none'; microphone 'none'; midi 'none'; payment 'none'; picture-in-picture 'none'; sync-xhr 'self' usb 'none'; vr 'none' Feature-Policy: accelerometer 'none'; ambient-light-sensor 'none'; autoplay 'none'; camera 'none'; encrypted-media 'none'; fullscreen 'none'; geolocation 'none'; gyroscope 'none'; magnetometer 'none'; microphone 'none'; midi 'none'; payment 'none'; picture-in-picture 'none'; sync-xhr 'self' usb 'none'; vr 'none' < Referrer-Policy: same-origin Referrer-Policy: same-origin < X-Frame-Options: SAMEORIGIN X-Frame-Options: SAMEORIGIN < X-Content-Type-Options: nosniff X-Content-Type-Options: nosniff < X-XSS-Protection: 1; mode=block X-XSS-Protection: 1; mode=block < Content-Security-Policy: frame-ancestors 'self' chrome-extension://nngceckbapebfimnlniiiahkandclblb moz-extension://* ; Content-Security-Policy: frame-ancestors 'self' chrome-extension://nngceckbapebfimnlniiiahkandclblb moz-extension://* ; < Access-Control-Allow-Origin: Access-Control-Allow-Origin: < * Connection #0 to host bw.domain.com left intact 

My reverse proxy is nginx but its configured with Mozilla intermediate. Despite the intermediate ssl-params, the TLS1.3 handshake looks to be established.

# openssl version OpenSSL 1.1.1d 10 Sep 2019 # nginx -V nginx version: nginx/1.16.1 built with OpenSSL 1.1.1d 10 Sep 2019 TLS SNI support enabled # uname -a Linux 5.4.15-arch1-1 

I'm using the following nginx-ssl params

ssl_session_timeout 1d; ssl_session_cache shared:MozSSL:10m; # about 40000 sessions ssl_session_tickets off; # curl > /path/to/dhparam.pem ssl_dhparam /etc/ssl/dhparam.pem; # intermediate configuration ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECD SA-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 off; # HSTS (ngx_http_headers_module is required) (63072000 seconds) #add_header Strict-Transport-Security "max-age=63072000" always; # OCSP stapling #ssl_stapling on; #ssl_stapling_verify on; resolver 10.0.1.1; 

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy