Назад | Перейти на главную страницу

Отключить TLS 1.0 в NGINX

У меня есть NGINX, который действует как обратный прокси для наших сайтов и работает очень хорошо. Для сайтов, которым нужен ssl, я следил raymii.org чтобы получить как можно более высокий балл SSLLabs. Один из сайтов должен быть совместим с PCI DSS, но на основе последнего сканирования TrustWave теперь дает сбой из-за включения TLS 1.0.

На уровне http в nginx.conf у меня есть:

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 для сайта как А но с 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

Найдите серверный блок, который вы хотите использовать в качестве шаблона согласования 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, а другие - с отключенным - не годится.

Проблема здесь в том, что Server name indication часть согласования TLS выполняется после согласования самого соединения. И протокол согласовывается во время согласования соединения.

Если вы настроите для этого виртуального хоста IP-адрес на сервере, с которым не связаны никакие другие виртуальные хосты, возможно, удастся принудительно отключить TLS v1.0 для этого виртуального хоста. Следовательно, nginx будет знать на основе IP-адреса, что использование TLS v 1.0 не допускается.

Я отключил TLSv1 на nginx версии 1.8.1. Вам необходимо обновить openssl до версий 1.0.1g или 1.0.1h. Затем просто удалите TLSv1 из директивы ssl_protocols:

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