Вимкнути 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 повинен проаналізувати ім’я сервера, звернутися до Віртуального хоста, а потім відхилити з'єднання, якщо воно не відповідає вимогам Virtual Host. Недолік дизайну, ймовірно, гідний CVE, оскільки TLS 1.0 часом сумнівний. Очевидно це порушення C&A в деяких обставинах.

Дякуємо за коментар Це цікаво, якщо це справді недолік дизайну.
Теро Кілканен

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 має ефект? В рамках конфігурації сервера, що містить декларацію_сервера за замовчуванням? Коли ця конфігурація використовується під час узгодження, налаштування ssl_protocolls в іншій конфігурації не робить ефекту?
robsch

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

1
Зазвичай люди не можуть замінити версію OpenSSL, коли вони знаходяться в розміщеному середовищі. Оператор сервера контролює конфігурацію сервера; не оператор веб-сайту, який орендує віртуальний сервер.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.