2014-11-30 15 views
5

Tôi đã định cấu hình Nginx cho hai máy chủ ảo TLS 'example.one' và 'example.two' với hai chứng chỉ khác nhau.Các giao thức TLS khác nhau trên mỗi máy chủ trong Nginx

Tôi cần thiết lập TLS1.0 + cho giá trị đầu tiên và chỉ TLS1.2 cho giá trị thứ hai. Tuy nhiên cấu hình thứ hai (example.two) bỏ qua chỉ thị ssl_protocols và lấy ssl_procolols từ chỉ thị máy chủ đầu tiên.

Do đó, cả chỉ thị máy chủ đều sử dụng chỉ thị ssl_protocols được định cấu hình đầu tiên.

server { 
    listen   443 default_server ssl spdy; 
    server_name  example.one; 

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 

    ssl_certificate   /certs/cert-for-example.one.pem; 
    ssl_certificate_key  /certs/privkey-for-example.one.pem; 


    # another ssl_* directives ... 
} 

server { 
    listen   443 ssl spdy; 
    server_name  example.two; 

    ssl_protocols TLSv1.2; 

    ssl_certificate   /certs/cert-for-example.two.pem; 
    ssl_certificate_key  /certs/privkey-for-example.two.pem; 

    # another ssl_* directives ... 
} 

Tôi không muốn sử dụng SSL3 để SNS TLS hoạt động tốt. Và tôi không quan tâm đến khách hàng mà không hỗ trợ TLS SNI.

Chỉ thông tin liên quan, tôi thấy là here. Nó nói, Openssl có trách nhiệm.

Tôi có làm gì sai không? Hoặc là có một cách giải quyết cho việc này? (Ngoại trừ địa chỉ IP riêng biệt cho chỉ thị máy chủ, nhưng tôi không muốn quay lại Thời kỳ đồ đá)

Tôi sử dụng Nginx/1.6.2, OpenSSL 1.0.1e trên Debian Wheezy.

+0

Đây là Nginx [lỗi] (https://trac.nginx.org/nginx/vé/676). Cả bản sao và [trùng lặp] của nó (https://trac.nginx.org/nginx/ticket/844) đều bị đóng dưới dạng _wontfix_. Cách giải quyết được đề cập có một @Anton được gửi bên dưới. –

Trả lời

-1

Tên máy chủ được xác định từ yêu cầu (hoặc từ phần mở rộng TLS nếu ServerNameIndication được hỗ trợ và trình bày hoặc thậm chí từ yêu cầu HTTP). Vì vậy, nó không thể tại thời gian bắt tay hoặc trước khi nó để biết những gì máy chủ khách hàng kết nối với và do đó những gì cài đặt để sử dụng.

Cập nhật: Here người từ nhóm nginx giải thích lý do tại sao điều này là không thể (vì lý do chính xác mà tôi đã viết).

+0

Tôi nghĩ rằng có tên máy chủ được trình bày trong gói ClientHello (TLS 1.0+ với hỗ trợ SNI), vì vậy IMHO sẽ không có vấn đề gì để xác định chỉ thị 'máy chủ' chính xác và chỉ thị 'ssl_protocols' có liên quan. – ZZromanZZ

+0

ZZromanZZ là đúng. – Khanna111

+1

@ZZromanZZ đó chỉ là về TLS với SNI. Nếu bạn đọc lại câu trả lời của tôi, tôi đã đề cập điều này một cách rõ ràng. Nếu bạn định cấu hình SSL 2.0 cho một máy chủ và SSL 3.0 cho một máy chủ khác, thì NGINX sẽ xử lý vấn đề này như thế nào? –

0

Bạn có sử dụng nginx từ các gói Dotdeb không? Nếu có, theo ý kiến ​​của tôi, đó là lỗi trong phiên bản Dotdeb của gói nginx-common trong phiên bản 1.6.x.

Tôi có cấu hình tương tự trong ubuntu (nginx 1.6.2-1 ~ dotdeb.0, openssl 1.0.1-4ubuntu5.20) và tôi không thể truy cập trang web của mình bằng TLSv1.1 hoặc TLSv1.2. Định cấu hình:

ssl_protocols TLSv1.2; 

làm cho trang web của tôi không khả dụng. Downgradnig nginx đến phiên bản 1.4.6-1ubuntu3.1 từ các kho lưu trữ mặc định đã giải quyết được vấn đề của tôi, bây giờ TLSv1.2 hoạt động trở lại. Vì vậy, theo ý kiến ​​của tôi vấn đề của bạn không phải là về "sử dụng ssl_protocoles khác nhau" nhưng về "bằng cách sử dụng TLSv.1.1 và TLSv1.2 trong nginx 1.6.x ~ dotdeb".

https://www.dotdeb.org/2014/06/30/nginx-1-6-0-has-been-updated-for-wheezy-and-squeeze/#comment-32895

2

Đó là cách hoạt động của ssl. SSL tạo kết nối trước và sau đó là SNI. Nginx sẽ nhận một thiết lập ssl (chẳng hạn như trong cấu hình máy chủ mặc định) để tạo kết nối ssl. Nếu cấu hình đó không chỉ định một số giao thức ssl, giao thức đó sẽ không được sử dụng chút nào.

Về cơ bản, "cơ bản cho mỗi giao thức ssl của máy chủ" sẽ không hoạt động như vậy.

Bạn có thể cố gắng chỉ định tập hợp các giao thức ssl trong cấu hình máy chủ mặc định và tắt một số trong mỗi cấu hình máy chủ. Tôi đã thử nó và nó đã hoạt động. Nhưng tôi đã không kiểm tra mọi trường hợp có thể xảy ra.

Bạn có thể thấy các cuộc thảo luận ở đây: http://mailman.nginx.org/pipermail/nginx/2014-November/045733.html

2

Là một workaround, có một khả năng để hạn chế phiên bản giao thức TLS sử dụng ssl_ciphers chỉ thị. Việc cung cấp các bộ mã hóa cụ thể TLSv1.2 sẽ ngăn chặn bắt tay hiệu quả các phiên bản TLS thấp hơn. Vì vậy, ví dụ trên,

ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256'; 

thay vì ssl_protocols TLSv1.2; sẽ thực hiện thủ thuật.

2

Điều này có vẻ là một lỗi trong nginx. Tôi cũng đã đăng câu trả lời này trên https://serverfault.com/a/827794/318927

Luôn sử dụng chỉ thị ssl_protocols từ khối server đầu tiên và bỏ qua bất kỳ khối server nào sau đây. Trong trường hợp của tôi, tôi có nhiều máy chủ ảo chạy trên cùng một cá thể, vì vậy tôi đã sử dụng lệnh nginx -T để hiển thị cấu hình kết hợp đầy đủ để tìm ra khối máy chủ nào là "đầu tiên" vì tôi đã chia nhỏ nó thành nhiều tệp cấu hình riêng biệt.

Vào thời điểm viết bài, tôi đang thử trên Ubuntu 14.04.5 với nginx được cài đặt từ số ondrej/nginx PPA. Cụ thể tôi đang chạy nginx 1.10.2 được xây dựng với OpenSSL 1.0.2j.

Sản lượng nginx -V

nginx version: nginx/1.10.2 
built with OpenSSL 1.0.2j 26 Sep 2016 
TLS SNI support enabled 
configure arguments: --with-cc-opt='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_spdy_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module --add-dynamic-module=/build/nginx-8xB1_y/nginx-1.10.2/debian/modules/nginx-auth-pam --add-dynamic-module=/build/nginx-8xB1_y/nginx-1.10.2/debian/modules/nginx-dav-ext-module --add-dynamic-module=/build/nginx-8xB1_y/nginx-1.10.2/debian/modules/nginx-echo --add-dynamic-module=/build/nginx-8xB1_y/nginx-1.10.2/debian/modules/nginx-upstream-fair --add-dynamic-module=/build/nginx-8xB1_y/nginx-1.10.2/debian/modules/ngx_http_substitutions_filter_module 

Là một workaround cho bạn tôi khuyên bạn nên cố gắng câu trả lời bởi Anton: https://stackoverflow.com/a/37511119/1446479

Các vấn đề liên quan