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-le...@nginx.org