Рейтинг:1

TLS 1.3 не работает на nginx 1.21 с openssl 1.1.1n

флаг us

У меня есть nginx (1.21.6), работающий с openssl 1.1.1n на сервере Debian 11. Хотя я следил за многими руководствами и просмотрел несколько вопросов на этом форуме по этой теме, я не могу заставить работать TLS 1.3. Результат нгинкс-V:

Версия nginx: nginx/1.21.6
построен gcc 10.2.1 20210110 (Debian 10.2.1-6)
построен с OpenSSL 1.1.1k 25 марта 2021 г. (работает с OpenSSL 1.1.1n 15 марта 2022 г.)
Поддержка TLS SNI включена

Я обновил nginx до основной версии, потому что не смог заставить работать TLS 1.3 и в предыдущих версиях. Это очень странно... Openssl определенно поддерживает TLS 1.3. Я проверил это через openssl s_client -tls1_3 -connect www.cloudflare.com:443 который работал хорошо. Вот мой ssl.conf файл nginx, который я включил в каждый из своих серверов nginx (сертификаты включены отдельно в разделы сервера):

ssl_session_timeout 1 д;
ssl_session_cache общий: SSL: 10 м; # около 40000 сеансов
ssl_session_tickets выключен;

ssl_stapling включен;
#ssl_trusted_certificate /pfad/bundle.ca.pem;
ssl_stapling_verify включен;

ssl_dhparam /etc/nginx/dhparams.pem;

ssl_ecdh_curve X448: secp521r1: secp384r1;


ssl_protocols TLSv1.3 TLSv1.2;
ssl_ciphers TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-AES-128-GCM-SHA256:TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:TLS-AES -128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA -CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers включен;

# HSTS (требуется ngx_http_headers_module) (63072000 секунд)
add_header Strict-Transport-Security "max-age=31536000;preload;includeSubDomains" всегда;

Qualys sslтест моих сайтов однако не показывает, что я использую TLS 1.3 на своем сервере. Кроме того, браузер Chrome показывает, что он подключается через TLS 1.2. Даже если я удалю TLSv1.2 директива от моего ssl.conf и оставив только TLSv1.3, он по-прежнему подключается через TLS 1.2.

Больше нигде нет ssl_protocolsв любом другом конфигурационном файле nginx. Я проверил это через нгинкс-Т.

У меня реально заканчиваются идеи..... Может кто-нибудь помочь мне?

РЕДАКТИРОВАТЬ: Почему-то nginx не реагирует на ssl_protocols и ssl_ecdh_curve директива должным образом. Например, когда я удаляю ssl_ciphers из моей конфигурации (как предложил @drookie в своем комментарии), TLS 1.0 и TLS 1.1, похоже, поддерживаются моим сервером, хотя я установил ssl_protocols TLSv1.3 TLSv1.2;. Аналогично, согласно Qualys ssltest, секп256р1 поддерживается, хотя у меня нет этой кривой в моей конфигурации ssl_ecdh_curve (ни премьер256v1). Мне кажется, что-то перезаписывает мои настройки в ssl.conf файл. Я использую acme.sh для получения своих сертификатов. grep -R 'ssl_protocol' /etc/* дает только строку в ssl.conf с ssl_protocols TLSv1.3 TLSv1.2;. Я понятия не имею, что может вызвать помехи/перезапись...

Steffen Ullrich avatar
флаг se
Вы проверяли журнал ошибок?
флаг br
Что сообщает nginx -t?
phonon112358 avatar
флаг us
@ Роберт Лонгсон `nginx -t nginx: синтаксис файла конфигурации /etc/nginx/nginx.conf в порядке nginx: проверка файла конфигурации /etc/nginx/nginx.conf прошла успешно`
phonon112358 avatar
флаг us
@Steffen Ullrich: я вижу только ошибки, поступающие от SSLTest от qualys, указывающие на то, что некоторые рукопожатия не увенчались успехом: `[crit] 94566#94566: *34 SSL_do_handshake() failed (SSL: error:14201044:SSL процедуры:tls_choose_sigalg:internal ошибка) при квитировании SSL, клиент: 64.41.200.113, сервер: 0.0.0.0:443`. Даже в режиме отладки при доступе к сайту больше не отображаются ошибки SSL.
phonon112358 avatar
флаг us
еще одна ошибка, исходящая от Qualys ssltest `[info] 47207#47207: * 206 SSL_do_handshake() не удалось (SSL: ошибка: 1417A0C1: подпрограммы SSL: tls_post_process_client_hello: нет общего шифра) при установлении связи SSL, клиент: 64.41.200.114, сервер: 0.0. 0,0:443`. Но я думаю, это нормально
drookie avatar
флаг za
Восстановите `ssl_ciphers`, попробуйте для начала значения по умолчанию. Вам может просто не хватать шифра для TLS 1.3.
phonon112358 avatar
флаг us
@drookie Удаление `ssl_ciphers` странным образом приводит к тому, что сервер принимает TLS 1.0 и TLS 1.1, но не TLS 1.3! Очень интересно, что он игнорирует `ssl_protocols`...
Рейтинг:1
флаг us

После многих дальнейших тестов и большого чтения я наконец нашел решение. Мне пришлось написать конфигурацию ssl в http блок, не в сервер блоки моей конфигурации nginx. Однако это сработало, только если я скопировал директивы из своего ssl.conf файл явно в http блокировать в моем nginx.conf (в противном случае нгинкс -т выходы

nginx: [появление] неверное количество аргументов в директиве include в /etc/nginx/nginx.conf:33
nginx: проверка файла конфигурации /etc/nginx/nginx.conf не удалась

почему-то).

Следовательно, мой http блок nginx.conf выглядит теперь следующим образом:

http {

  ...
 
    ssl_dhparam /etc/nginx/dhparams.pem;
    
    ssl_ecdh_curve X448: secp521r1: secp384r1;
    
    ssl_protocols TLSv1.3 TLSv1.2;
   ssl_ciphers 'TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA- AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';

   ...

    # Конфигурации виртуального хоста
    ##

    включить /etc/nginx/conf.d/*.conf;
    включить /etc/nginx/sites-enabled/*;
}

Я не знаю, почему эти настройки ssl должны быть включены/вставлены в http блок, а не в каждом сервер блокировать..... Но это работает, и TLS 1.3 включен!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.