NGINX에서 TLS 1.0 비활성화


22

우리 사이트의 리버스 프록시 역할을하는 NGINX가 있으며 매우 잘 작동합니다. 필요에 SSL이 사이트를 위해 나는 다음 raymii.org을 SSLLabs 가능한 점수의 확인 강한로 가질 수 있도록. 사이트 중 하나가 PCI DSS를 준수해야하지만 TLS 1.0을 사용하도록 설정했기 때문에 최신 TrustWave 스캔을 기반으로 실패했습니다.

nginx.conf의 http 수준에는 다음이 있습니다.

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

특정 서버의 경우 :

ssl_protocols TLSv1.1 TLSv1.2;

암호를 변경하고 http 레벨에서 각 SSL 사이트 서버로 이동했지만 실행 시간에 관계없이 다음과 같습니다.

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

TLS 1.0에 유효한 연결이 있습니다. SSLLabs는 사이트의 nginx 설정을 A 로 설정 하지만 TLS 1.0을 사용하므로 나머지 설정이 정확하다고 생각하므로 TLS 1.0을 끄지 않습니다.

내가 놓칠 수있는 것에 대한 생각?

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
2016 년 6 월 30 일까지 TLS 1.0을 반드시 제거 할 필요는 없습니다.
Michael Hampton

답변:


12

여기서 문제 Server name indication는 연결 자체가 협상 된 후에 TLS 협상 의 일부가 수행 된다는 것 입니다. 그리고 연결 협상 중에 프로토콜이 협상됩니다.

연결된 가상 호스트가없는 서버의 IP 주소로 가상 호스트를 구성하는 경우 해당 가상 호스트에 대해 TLS v1.0을 적용하지 않을 수 있습니다. 따라서 nginx는 IP 주소를 기반으로 TLS v 1.0이 허용되지 않음을 알고 있습니다.


감사. 현재 테스트 할 여분의 IP가 없기 때문에이 문제를 해결할 방법이 없다고 가정합니다.
Shawn C.

1
Server Name IndicationTLS의 일부입니다 ClientHello. 클라이언트가 보낸 첫 번째 메시지에 있으며 나중에 협상하지 않습니다. Nginx에 디자인 결함이있는 것처럼 들립니다. 연결을 수락 한 것처럼 들리며 가상 호스트가 올바른지 여부에 관계없이 전달됩니다. 대신 nginx는 서버 이름을 구문 분석하고 가상 호스트를 참조한 다음 가상 호스트의 요구 사항을 충족시키지 못하면 연결을 거부해야합니다. TLS 1.0이 때때로 문제가되기 때문에 설계 결함이 CVE에 적합 할 수 있습니다. 어떤 상황에서는 분명히 C & A 위반입니다.

의견 주셔서 감사합니다. 이것이 실제 디자인 결함이라면 흥미 롭습니다.
Tero Kilkanen

1
2019 년에 새로운 nginx 버전으로 변경되지 않습니까?
robsch

18

"기본"ssl 협상 템플릿으로 사용하려는 서버 블록을 찾으십시오. 청취 라인 찾기

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

그리고 default_server줄의 끝에 추가하십시오

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

이를 통해 nginx가 사용할 TLS 버전을 협상 할 때 구성 할 수 있습니다. 단점은 포트 당 하나의 기본 서버 만 가질 수 있다는 것입니다. 따라서 TLSv1이 활성화 된 가상 도메인과 비활성화 된 가상 도메인을 갖는 것은 불가능합니다.


그것은 ssl_protocolls가 영향을 미치는 단일 장소 만 있다는 것을 의미합니까? default_server 선언이있는 서버 구성 내에서? 협상 중에이 구성을 사용하면 다른 구성 내의 ssl_protocolls 설정이 영향을 미치지 않습니까?
robsch

4

nginx 버전 1.8.1에서 TLSv1을 비활성화했습니다. openssl을 1.0.1g 또는 1.0.1h 버전으로 업데이트해야합니다. 그런 다음 ssl_protocols 지시문에서 'TLSv1'을 제거하십시오.

ssl_protocols TLSv1.1 TLSv1.2

그런 다음 명령으로 TLSv1을 통한 연결을 확인하십시오.

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

당신은 그런 것을 얻을 것입니다 :

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
사람들은 일반적으로 호스팅 환경에있을 때 OpenSSL 버전을 대체 할 수 없습니다. 서버 운영자는 서버의 구성을 제어합니다. 가상 서버를 임대하는 웹 사이트 운영자가 아닙니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.