nginx doesn't (yet) support configuring TLSv1.3 ciphersuite order preference. It's hardcoded in OpenSSL in include/openssl/ssl.h, so to e.g. prioritize ChaCha20 over the AES suites, apply the following patch:
diff -urN openssl-1.1.1a-old/include/openssl/ssl.h openssl-1.1.1a/include/openssl/ssl.h --- openssl-1.1.1a-old/include/openssl/ssl.h 2018-11-20 13:35:40.000000000 +0000 +++ openssl-1.1.1a/include/openssl/ssl.h 2018-12-26 05:32:44.915797200 +0000 @@ -173,8 +173,8 @@ # define SSL_DEFAULT_CIPHER_LIST "ALL:!COMPLEMENTOFDEFAULT:!eNULL" /* This is the default set of TLSv1.3 ciphersuites */ # if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305) -# define TLS_DEFAULT_CIPHERSUITES "TLS_AES_256_GCM_SHA384:" \ - "TLS_CHACHA20_POLY1305_SHA256:" \ +# define TLS_DEFAULT_CIPHERSUITES "TLS_CHACHA20_POLY1305_SHA256:" \ + "TLS_AES_256_GCM_SHA384:" \ "TLS_AES_128_GCM_SHA256" # else # define TLS_DEFAULT_CIPHERSUITES "TLS_AES_256_GCM_SHA384:" \Then build as normal: ./configure --with-openssl=/path/to/patched/openssl-1.1.1a etc.
[Interface] Address = 10.222.222.1/24, fd00:222:222::1/64 ListenPort = REPLACE_WITH_SERVER_PORT PrivateKey = REPLACE_WITH_SERVER_PRIVATE_KEY PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE ; ip6tables -A FORWARD -i %i -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE ; ip6tables -D FORWARD -i %i -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE [Peer] PublicKey = REPLACE_WITH_CLIENT_PUBLIC_KEY AllowedIPs = 10.222.222.2/32, fd00:222:222::2/128
[Interface] Address = 10.222.222.2/32, fd00:222:222::2/128 PrivateKey = REPLACE_WITH_CLIENT_PRIVATE_KEY DNS = 1.1.1.1, 2606:4700:4700::1111 [Peer] Endpoint = REPLACE_WITH_SERVER_IP:REPLACE_WITH_SERVER_PORT PublicKey = REPLACE_WITH_SERVER_PUBLIC_KEY AllowedIPs = 0.0.0.0/0, ::/0
post-up ip addr change REPLACE_WITH_SERVER_PUBLIC_IPV6_ADDR/64 dev eth0 preferred_lft forever