TLS 1.3 sudah beberapa tahun muncul dan memberikan benefit seperti Handshake yang lebih cepat dan downgrade protection. Semua browser sudah support TLS 1.3, Google Chrome sejak versi 66 dan Firefox sejak versi 60.
Agar bisa menggunakan TLS 1.3 minimal nginx yang digunakan adalah versi 1.14, OpenSSL versi 1.1.1 dan tentunya memiliki sertifikat SSL
Cek versi nginx dengan nginx -v
$ nginx -v nginx version: nginx/1.18.0
Cek versi OpenSSL dengan openssl version
$ openssl version OpenSSL 1.1.1i 8 Dec 2020
Setting TLS 1.3 di Nginx
Cara setting TLS 1.3 di nginx sebenarnya sangat sederhana, contohnya
server { listen 443 http2 ssl; server_name jaranguda.com; ssl_certificate /etc/nginx/ssl/jaranguda.com/fullchain.cer; ssl_certificate_key /etc/nginx/ssl/jaranguda.com/jaranguda.com.key; root /var/www/domains/jaranguda.com; ssl_protocols TLSv1.2 TLSv1.3; }
Bagian yang mengaktifkan TLS 1.3 berada dibaris ssl_protocols TLSv1.2 TLSv1.3, ingat urutannya adalah versi lama ke versi baru, bila ingin mengaktifkan semua versi TLS menjadi
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
Testing TLS 1.3
Untuk testingnya sendiri kita akan menggunakan OpenSSL dan curl, ada banyak tools yang bertebaran di Internet, tetapi dengan kedua tools ini seharusnya sudah cukup tanpa perlu menggunakan bantuan pihak ketiga (thirdparty)
Contoh dengan curl
curl --tlsv1.3 https://EXAMPLE.com
Contoh dengan openssl
openssl s_client -connect EXAMPLE.com:443 -tls1_3
Troubleshooting TLS di Nginx
Ada kasus unik yang menghabiskan berjam-jam untuk debuggingnya ;), error yang ditampilkan
# openssl CONNECTED(00000003) 140217493542720:error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version:ssl/record/rec_layer_s3.c:1543:SSL alert number 70 --- no peer certificate available --- No client certificate CA names sent --- SSL handshake has read 7 bytes and written 260 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) # curl * ALPN, offering h2 * ALPN, offering http/1.1 * successfully set certificate verify locations: * CAfile: none CApath: /etc/ssl/certs * TLSv1.3 (OUT), TLS handshake, Client hello (1): * TLSv1.3 (IN), TLS alert, protocol version (582): * error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version * Closing connection 0
error tersebut tetap muncul walaupun TLS 1.3 sudah di setting di server block nginx. Di server yang digunakan untuk testing, saya memiliki banyak domain (multi domain) dengan konfigurasi nginx masing-masing, saya memiliki 1 server block default yang saya beri nama 000-default
isi konfigurasinya
server { listen 80 default_server; server_name _; root /var/www/tanpa/isi; index index.html; } server { listen 443 http2 default_server; server_name _; root /var/www/tanpa/isi; index index.html; ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem; ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key; }
bila tidak disertakan default_server dibelakang listen maka yang menjadi default adalah berdasarkan urutan abjad file konfigurasinya. Dengan konfigurasi diatas akses ke TLS 1.3 akan selalu error seperti yang diatas. Solusinya adalah dengan menambahkan ssl_protocols TLSv1.2 TLSv1.3 dikonfigurasi tersebut, setelah restart testing terhadap semua domain bisa mengakses TLS 1.3
Saya kesusaan mengantikan password WiFi saya