параллельные сертификаты ECDSA/RSA и @SECLEVEL

Maxim Dounin mdounin на mdounin.ru
Вт Июн 28 23:26:15 UTC 2022


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