Hello!
On Mon, Jun 27, 2022 at 03:24:48PM -0400, edo1 wrote:
> Дано:
> nginx 1.23 (сборка под bullseye с nginx.org), openssl 1.1.1n (из debian)
> два сертификата от LE, RSA и P-256.
> testssl.sh
>
> Нужно сделать, чтобы старые клиенты, умеющие только TLSc1/RSA, могли
> подключаться.
> Запускаем testssl.sh, TLSv1 и 1.1 не работают (только 1.2):
> SSLv2 not offered (OK)
> SSLv3 not offered (OK)
> TLS 1 offered (deprecated)
> TLS 1.1 offered (deprecated)
> TLS 1.2 offered (OK)
> TLS 1.3 not offered and downgraded to a weaker protocol
>
> Убираем один из сертификатов — TLSv1 появляется, с двумя — только 1.2
(Just in case, в приведённом фрагменте вывода testssl.sh как раз
видно, что TLSv1 и TLSv1.1 работают.)
> Идём, например, на
> https://ssl-config.mozilla.org/#server=nginx&version=1.23&config=old&openssl=1.1.1n&hsts=false&ocsp=false&guideline=5.6
> прописываем ssl_ciphers оттуда.
> Не помогает.
>
> Добавляем в конец списка шифров :@SECLEVEL=0
> TLSv1 начинает работать.
>
> Решил редуцировать пример, дошёл до такого:
> a. ssl_ciphers AES128-SHA;
> TLSv1 работает
>
> b. ssl_ciphers AES128-SHA:ECDHE-ECDSA-AES128-SHA;
> TLSv1 работает
>
> c. ssl_ciphers ECDHE-ECDSA-AES128-SHA:AES128-SHA;
> TLSv1 НЕ работает
>
> d. ssl_ciphers ECDHE-ECDSA-AES128-SHA256:AES128-SHA;
> TLSv1 работает
>
> e. ssl_ciphers ECDHE-ECDSA-AES128-SHA:AES128-SHA:@SECLEVEL=0;
> TLSv1 работает
>
>
> :@SECLEVEL=0 прописать недолго, тем более, что, если я ничего не путаю, с
> переходом на openssl3 так и так придётся это делать; но неконсистентность
> поведения удивила.
> это вообще баг или фича? )
>
> за десять минут просмотра кода нжинкса возникло ощущение, что дело не в нём,
> а так срабатывают какие-то эвристики в openssl.
> код openssl пока не смотрел.
Debian по умолчанию использует в настройках OpenSSL SECLEVEL=2,
что приводит к тому, что ECDHE-ECDSA-AES128-SHA не работает из-за
использования SHA1 в процессе key exchange. Ибо для SECLEVEL=2
требуется минимум 112 бит криптостойкости, а SHA1 обеспечивает
максимум 80 (а с учётом атак - и того меньше, что и отражено в
OpenSSL 3.0). От этого у вас TLSv1 и ломается без SECLEVEL=0 (для
OpenSSL 1.1.1 хватит и SECLEVEL=1).
При этом AES128-SHA работает, т.к. в процессе key exchange SHA1 не
используется. Вот тут, например, об этом подробнее:
https://github.com/openssl/openssl/issues/18194
При этом OpenSSL сначала выбирает, какой шифр использовать, а
потом уже ломается из-за ограничений на security level
используемого алгоритма подписи, так что наличие других работающих
шифров на ситуацию не влияет.
(Кроме того, в случае TLSv1.2 клиент может, и обычно передаёт,
дополнительные поддерживаемые алгоритмы подписи, и если он это
сделал - шифр ECDHE-ECDSA-AES128-SHA будет работать.)
--
Maxim Dounin
http://mdounin.ru/
_______________________________________________
nginx-ru mailing list -- nginx-ru@nginx.org
To unsubscribe send an email to nginx-ru-leave@nginx.org