Vô hiệu hóa TLS 1.0 trong NGINX


22

Tôi có NGINX hoạt động như một proxy ngược cho các trang web của chúng tôi và đang hoạt động rất tốt. Đối với các trang web cần ssl, tôi đã theo dõi raymii.org để đảm bảo có điểm SSLLabs càng mạnh càng tốt. Một trong những trang web cần phải tuân thủ PCI DSS nhưng dựa trên quá trình quét TrustWave mới nhất hiện không thành công do TLS 1.0 được bật.

Ở cấp độ http trong nginx.conf tôi có:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

Đối với máy chủ cụ thể tôi có:

ssl_protocols TLSv1.1 TLSv1.2;

Tôi đã thay đổi mật mã, chuyển mọi thứ ra khỏi cấp http và đến từng máy chủ trang web ssl nhưng không có vấn đề gì khi tôi chạy:

openssl s_client -connect www.example.com:443 -tls1

Tôi nhận được kết nối hợp lệ cho TLS 1.0. SSLLabs đặt thiết lập nginx cho trang web là A nhưng với TLS 1.0 vì vậy tôi tin rằng phần còn lại của thiết lập của tôi là chính xác, nó sẽ không tắt TLS 1.0.

Suy nghĩ về những gì tôi có thể thiếu?

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

1
Lưu ý rằng không bắt buộc phải xóa TLS 1.0 cho đến ngày 30 tháng 6 năm 2016.
Michael Hampton

Câu trả lời:


12

Vấn đề ở đây là Server name indicationmột phần của đàm phán TLS được thực hiện sau khi chính kết nối đã được đàm phán. Và giao thức được đàm phán trong quá trình đàm phán kết nối.

Có thể thực thi không có TLS v1.0 cho máy chủ ảo đó nếu bạn định cấu hình máy chủ ảo đó thành địa chỉ IP trên máy chủ không có máy chủ ảo khác được liên kết với nó. Do đó nginx sẽ biết dựa trên địa chỉ IP rằng không cho phép TLS v 1.0.


Cảm ơn. Tôi cho rằng không có cách nào khác vì chúng tôi không có IP dự phòng vào lúc này để kiểm tra điều đó.
Shawn C.

1
Server Name Indicationlà một phần của TLS ClientHello. Đó là trong tin nhắn đầu tiên được gửi bởi khách hàng, và không được thương lượng sau đó. Nghe có vẻ giống như Nginx có một lỗi thiết kế. có vẻ như nó chấp nhận kết nối và sau đó chuyển tiếp đến Máy chủ ảo cho dù đúng hay sai. Thay vào đó, nginx nên phân tích tên máy chủ, tham khảo Máy chủ ảo và sau đó từ chối kết nối nếu không đáp ứng yêu cầu của Máy chủ ảo. Lỗ hổng thiết kế có lẽ là CVE xứng đáng vì TLS 1.0 đôi khi có vấn đề. Nó rõ ràng là một vi phạm C & A trong một số trường hợp.

Cảm ơn các bình luận. Điều này là thú vị nếu nó thực sự là một lỗ hổng thiết kế thực sự.
Tero Kilkanen

1
Đây có phải là không thay đổi trong năm 2019 với các phiên bản nginx mới hơn?
robsch

18

Đi tìm một khối máy chủ mà bạn muốn sử dụng làm mẫu đàm phán ssl "mặc định" của bạn. Tìm dòng nghe của bạn

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

và thêm default_servervào cuối dòng

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

Điều này cho phép nginx có cấu hình khi đàm phán nên sử dụng phiên bản TLS nào. Nhược điểm là bạn chỉ có thể có một máy chủ mặc định cho mỗi cổng. Vì vậy, có một số tên miền ảo với TLSv1 được kích hoạt và những tên miền khác bị vô hiệu hóa là điều không nên.


Điều đó có nghĩa là chỉ có một nơi duy nhất mà ssl_protocolls có hiệu lực? Trong cấu hình máy chủ có khai báo default_server? Khi cấu hình này được sử dụng trong quá trình đàm phán, cài đặt ssl_protocolls trong cấu hình khác không có hiệu lực?
robsch

4

Tôi đã tắt TLSv1 trên nginx phiên bản 1.8.1. Bạn cần cập nhật openssl lên phiên bản 1.0.1g hoặc 1.0.1h. Sau đó, chỉ cần xóa 'TLSv1' khỏi chỉ thị ssl_prot Protocol:

ssl_protocols TLSv1.1 TLSv1.2

Sau đó kiểm tra kết nối qua TLSv1 bằng lệnh:

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

Bạn sẽ nhận được một cái gì đó như thế:

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)
---

1
Mọi người thường không thể thay thế phiên bản OpenSSL khi họ ở trong môi trường được lưu trữ. Toán tử máy chủ kiểm soát cấu hình của máy chủ; không phải nhà điều hành trang web đang thuê máy chủ ảo.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.