Saya memiliki NGINX yang bertindak sebagai proxy terbalik untuk situs kami dan bekerja dengan sangat baik. Untuk situs yang membutuhkan ssl saya mengikuti raymii.org untuk memastikan agar memiliki skor SSLLabs sekuat mungkin. Salah satu situs harus memenuhi PCI DSS tetapi berdasarkan pemindaian TrustWave terbaru sekarang gagal karena TLS 1.0 sedang diaktifkan.
Pada level http di nginx.conf saya punya:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
Untuk server spesifik saya punya:
ssl_protocols TLSv1.1 TLSv1.2;
Saya telah mengubah sandi, memindahkan hal-hal dari tingkat http dan ke setiap server situs ssl tetapi tidak peduli apa yang terjadi ketika saya menjalankan:
openssl s_client -connect www.example.com:443 -tls1
Saya mendapatkan koneksi yang valid untuk TLS 1.0. SSLLabs menempatkan pengaturan nginx untuk situs sebagai A tetapi dengan TLS 1.0 jadi saya percaya bahwa sisa pengaturan saya sudah benar itu tidak akan mematikan TLS 1.0.
Pikiran tentang apa yang bisa saya lewatkan?
openssl version -a
OpenSSL 1.0.1f 6 Jan 2014
built on: Thu Jun 11 15:28:12 UTC 2015
platform: debian-amd64
nginx -v
nginx version: nginx/1.8.0
Jawaban:
Masalahnya di sini adalah bahwa
Server name indication
bagian dari negosiasi TLS dilakukan setelah koneksi itu sendiri dinegosiasikan. Dan protokol dinegosiasikan selama negosiasi koneksi.Dimungkinkan untuk memberlakukan tidak ada TLS v1.0 untuk host virtual itu jika Anda mengkonfigurasi host virtual itu ke alamat IP di server yang tidak memiliki host virtual lain yang terkait dengannya. Oleh karena itu nginx akan tahu berdasarkan alamat IP bahwa tidak ada TLS v 1.0 yang diizinkan.
sumber
Server Name Indication
adalah bagian dari TLSClientHello
. Itu ada dalam pesan pertama yang dikirim oleh klien, dan tidak dinegosiasikan nanti. Sepertinya Nginx memiliki cacat desain. sepertinya menerima koneksi, dan kemudian meneruskan ke Virtual Host apakah benar atau salah. Sebagai gantinya, nginx harus mem-parsing nama server, berkonsultasi dengan Virtual Host, dan kemudian menolak koneksi jika gagal memenuhi persyaratan Virtual Host. Cacat desain mungkin CVE layak karena TLS 1.0 dipertanyakan di kali. Ini jelas merupakan pelanggaran C&A dalam beberapa keadaan.Temukan blok server yang ingin Anda gunakan sebagai templat negosiasi ssl "default" Anda. Temukan jalur pendengaran Anda
dan tambahkan
default_server
ke akhir barisIni memungkinkan nginx untuk memiliki konfigurasi ketika sedang merundingkan versi TLS mana yang akan digunakan. Kelemahannya adalah Anda hanya dapat memiliki satu server default per port. Jadi memiliki beberapa domain virtual dengan TLSv1 diaktifkan dan yang lain dengan itu dinonaktifkan adalah tidak jalan.
sumber
Saya menonaktifkan TLSv1 pada nginx versi 1.8.1. Anda perlu memperbarui versi openssl ke 1.0.1g atau 1.0.1h. Maka cukup hapus 'TLSv1' dari arahan ssl_protocols:
Kemudian periksa koneksi melalui TLSv1 dengan perintah:
Anda harus mendapatkan sesuatu seperti itu:
sumber