2014-11-30 1 views
5

두 개의 다른 인증서로 두 개의 TLS 가상 호스트 'example.one'과 'example.two'에 대해 Nginx를 구성했습니다.Nginx에서 서버별로 다른 TLS 프로토콜

처음 TLS1.0 +을 설정하고 두 번째 TLS1.2 만 설정해야합니다. 그러나 두 번째 구성 (example.two)은 ssl_protocols 지시문을 무시하고 첫 번째 server 지시문에서 ssl_procolols를 가져옵니다.

따라서 두 서버 지정 문 모두 첫 번째 구성된 ssl_protocols 지정 문을 사용합니다.

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

TLS SNI가 제대로 작동하려면 SSL3을 사용하고 싶지 않습니다. TLS SNI 지원이없는 고객은 신경 쓰지 않습니다.

관련 정보 만 찾았다면 here입니다. Openssl은 책임이 있습니다.

내가 잘못 했나요? 아니면 이에 대한 해결 방법이 있습니까? (서버 지침에서 별도의 IP 주소는 제외하지만 석기 시대로 돌아가고 싶지 않습니다.)

데비안 Wheezy에서 Nginx/1.6.2, OpenSSL 1.0.1e를 사용합니다.

+0

Nginx에 [버그] (https://trac.nginx.org/nginx/항공권/676). 그것과 그것의 [duplicate] (https://trac.nginx.org/nginx/ticket/844)는 _wontfix_로 닫힙니다. 언급 된 해결 방법은 아래에 제출 된 @Anton입니다. –

답변

-1

서버 이름은 요청에서 결정됩니다 (ServerNameIndication이 지원되고 현재 또는 심지어 HTTP 요청에서 오는 경우 TLS 확장에서 가져옴). 따라서 핸드 셰이크 시간이나 클라이언트가 어떤 서버에 연결하고 결과적으로 어떤 설정을 사용하는지 알기 전에는 불가능합니다.

업데이트 : Here nginx 팀의 담당자가 왜 이것이 가능하지 않은지 설명합니다 (정확히 내가 쓴 이유 때문).

+0

ClientHello 패킷 (SNI 지원 TLS 1.0+)에 서버 이름이 표시되어 있다고 생각합니다. 따라서 올바른 '서버'지시문과 관련 'ssl_protocols'지시문을 결정하는 데 아무런 문제가 없어야합니다. – ZZromanZZ

+0

ZZromanZZ가 맞습니다. – Khanna111

+1

@ZZromanZZ 이것은 SNI가있는 TLS에 관한 것입니다. 당신이 내 대답을 다시 읽으면, 나는 이것을 명시 적으로 언급했다. 한 서버에 대해 SSL 2.0을 구성하고 다른 서버에 SSL 3.0을 구성하면 NGINX는 어떻게 처리해야합니까? –

0

Dotdeb 패키지의 nginx를 사용합니까? 그렇다면 버전 1.6.x의 nginx-common 패키지의 Dotdeb 버전에서는 버그가 있다고 생각합니다.

나는 (nginx를 1.6.2-1 ~ dotdeb.0, OpenSSL을 1.0.1-4ubuntu5.20) 우분투 비슷한 구성을 가지고 내가 TLSv1.1 또는 TLSv1.2를 사용하여 내 웹 사이트에 액세스 할 수 없습니다. 구성 :

ssl_protocols TLSv1.2; 

내 웹 사이트를 사용할 수 없게 만들었습니다. 기본 저장소에서 1.4.6-1ubuntu3.1 버전으로 다운 그레이드하면 내 문제가 해결되어 TLSv1.2가 다시 작동합니다. 그래서 내 생각에 귀하의 문제는 "다른 ssl_protocoles 사용"에 대한 것이 아니라 "TLSv.1.1 및 TLSv1.2 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

그것은 어떻게 SSL 작품입니다. SSL은 먼저 연결을 생성 한 다음 SNI를 수행합니다. Nginx는 ssl 연결을 생성하기 위해 하나의 SSL 설정 (예 : 기본 서버 구성)을 선택합니다. 해당 구성이 일부 ssl 프로토콜을 지정하지 않으면 해당 프로토콜이 전혀 사용되지 않습니다.

기본적으로 "당 서버 SSL 프로토콜"은 모양대로 작동하지 않습니다.

기본 서버 구성에서 ssl 프로토콜의 조합 세트를 지정하고 모든 서버 구성에서 일부를 비활성화 할 수 있습니다. 나는 이것을 시도했고 효과가 있었다. 그러나 모든 가능한 경우를 테스트하지는 않았습니다.

는 현재 논의 볼 수 있습니다

: 해결 방법으로 http://mailman.nginx.org/pipermail/nginx/2014-November/045733.html

2

을하는 ssl_ciphers 지시어를 사용하여 TLS 프로토콜 버전을 제한 할 수있다. TLSv1.2 특정 암호 스위트를 제공하면 더 낮은 TLS 버전의 핸드 셰이크를 효과적으로 방지 할 수 있습니다. 위 예의 경우

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

대신 ssl_protocols TLSv1.2;이 트릭을 수행합니다.

2

이것은 nginx의 버그 인 것 같습니다. 나는 또한 항상 첫 번째 server 블록에서 ssl_protocols 지시어를 사용하고 다음 server 블록을 무시하는 것 https://serverfault.com/a/827794/318927

에이 대답을 기록했다. 제 경우에는 많은 가상 서버가 같은 인스턴스에서 실행되기 때문에 nginx -T 명령을 사용하여 여러 개의 개별 구성 파일로 분할했기 때문에 "첫 번째"서버 블록을 파악하기위한 전체 결합 된 구성을 표시했습니다.

글을 쓰는 시점에 나는 ondrej/nginx PPA에서 설치된 nginx를 사용하여 우분투 14.04.5에서이 작업을 시도하고 있습니다. 특히 OpenSSL 1.0.2j로 빌드 된 nginx 1.10.2를 실행하고 있습니다.

출력 당신을위한 해결 방법으로 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 

의 내가 안톤으로 답을하려고 제안 : 가 여기 https://stackoverflow.com/a/37511119/1446479

관련 문제