Nonaktifkan TLS 1.0 di NGINX

19

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
Shawn C.
sumber
1
Perhatikan bahwa tidak wajib menghapus TLS 1.0 hingga 30 Juni 2016.
Michael Hampton

Jawaban:

11

Masalahnya di sini adalah bahwa Server name indicationbagian 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.

Tero Kilkanen
sumber
Terima kasih. Saya mengasumsikan tidak ada jalan keluar karena kami tidak memiliki IP cadangan saat ini untuk mengujinya.
Shawn C.
1
Server Name Indicationadalah bagian dari TLS ClientHello. 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.
Terima kasih atas komentarnya. Ini menarik jika itu benar-benar cacat desain nyata.
Tero Kilkanen
1
Apakah ini tidak berubah pada 2019 dengan versi nginx yang lebih baru?
robsch
17

Temukan blok server yang ingin Anda gunakan sebagai templat negosiasi ssl "default" Anda. Temukan jalur pendengaran Anda

server {
    ...
    listen 443 ssl;
    ssl_protocols TLSv1.1 TLSv1.2;
    ...
}

dan tambahkan default_serverke akhir baris

server {
    ...
    listen 443 ssl default_server;
    ssl_protocols TLSv1.1 TLSv1.2;
    ...
}

Ini 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.

Thego Rilla
sumber
Apakah itu berarti bahwa hanya ada satu tempat di mana ssl_protocolls memiliki efek? Dalam konfigurasi server yang memiliki deklarasi default_server? Ketika konfigurasi ini digunakan selama negosiasi, pengaturan ssl_protocolls dalam konfigurasi lain tidak berpengaruh?
robsch
4

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:

ssl_protocols TLSv1.1 TLSv1.2

Kemudian periksa koneksi melalui TLSv1 dengan perintah:

openssl s_client -tls1 -connect example.com:443 < /dev/null

Anda harus mendapatkan sesuatu seperti itu:

CONNECTED(00000003)
write:errno=104
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 0 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1
    Cipher    : 0000
    Session-ID: 
    Session-ID-ctx: 
    Master-Key: 
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    Start Time: 1474531027
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
---
sekarang
sumber
Orang-orang biasanya tidak dapat mengganti versi OpenSSL ketika mereka berada di lingkungan yang dihosting. Operator server mengontrol konfigurasi server; bukan operator situs web yang menyewa server virtual.