У меня есть 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)
---