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

22

У меня есть 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 для сайта как 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
Обратите внимание, что не обязательно удалять TLS 1.0 до 30 июня 2016 года.
Майкл Хэмптон

Ответы:

12

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

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

Теро Килканен
источник
Благодарю. Я предполагаю, что нет никакого способа обойти это, поскольку у нас нет запасного IP на данный момент, чтобы проверить это.
Шон С.
1
Server Name Indicationявляется частью TLS ClientHello. Оно находится в первом сообщении, отправленном клиентом, а не согласовано позже. Больше похоже на то, что у Nginx есть недостаток дизайна. Похоже, он принимает соединение, а затем перенаправляет его на виртуальный хост, независимо от того, правильно он или нет. Вместо этого nginx должен проанализировать имя сервера, обратиться к виртуальному хосту, а затем отклонить соединение, если оно не соответствует требованиям виртуального хоста. Недостаток дизайна, вероятно, достоин CVE, поскольку TLS 1.0 иногда вызывает сомнения. Это явно нарушение C & A в некоторых обстоятельствах.
Спасибо за комментарий. Это интересно, если это действительно настоящий недостаток дизайна.
Теро Килканен
1
Не изменилось ли это в 2019 году с более новыми версиями nginx?
Робш
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 в другой конфигурации не оказывает влияния?
Робш
4

Я отключил 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)
---
r0den
источник
1
Люди обычно не могут заменить версию OpenSSL, когда они находятся в размещенной среде. Оператор сервера контролирует конфигурацию сервера; не оператор веб-сайта, который арендует виртуальный сервер.