Re: SSL Early Data поддерживает только первый worker?

Maxim Dounin mdounin на mdounin.ru
Ср Янв 29 12:06:29 UTC 2020


Hello!

On Wed, Jan 29, 2020 at 01:40:44PM +0300, Sergey Kandaurov wrote:

> 
> > On 29 Jan 2020, at 06:20, Ilya Evseev <nginx-forum at forum.nginx.org> wrote:
> > 
> > Есть Nginx 1.17.8, собран со свежей BoringSSL stable.
> > Запущен на Linux kernel 5.4.10:
> > 
> > [..]
> > SSL в Nginx'e настроен так:
> > 
> >  ssl_dhparam /etc/pki/tls/private/dhparam2048.pem;
> >  ssl_session_timeout 1h;
> >  ssl_session_cache shared:SSL:10m;
> >  ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
> >  ssl_ciphers
> > kEECDH+ECDSA+AESGCM:kEECDH+AES128:kEECDH:kEDH:-3DES:kRSA+AES128:kEDH+3DES:DES-CBC3-SHA:!RC4:!aNULL:!eNULL:!MD5:!EXPORT:!LOW:!SEED:!CAMELLIA:!IDEA:!PSK:!SRP:!SSLv2;
> >  ssl_prefer_server_ciphers on;
> >  ssl_early_data on;
> > 
> > Проверяю, поддерживает ли он SSL early data:
> > 
> > docker run --rm -it nablac0d3/sslyze --early_data 1.2.3.4
> > 
> > Результат:
> > 
> > - Если в nginx'e настроен "worker_processes 1;", sslyze всегда возвращает
> > "Suppported - Server accepted early data"
> > - Если воркеров больше одного, "Supported" начинает возвращаться не всегда.
> > Чем больше воркеров - тем чаще возвращается "Not supported".
> > 
> > Т.е. выглядит так, будто SSL Early Data поддерживает только первый воркер.
> > 
> > Этому есть какое-то объяснение?
> 
> Тут дело не в early data, а в том что BoringSSL по какой-то причине не
> разрешает сохранять тикеты в session cache.  В итоге сессия восстанавливается
> только по тикету из того же рабочего процесса, который его породил.
> Это означает, что восстановление сессий из кеша (в т.ч. shared) не будет
> работать и для TLSv1.2 со включёнными по умолчанию тикетами.

Э.  Тикеты - восстанавливаются по ключу, который задаётся в 
master-процессе и соответственно одинаковый во всех рабочих 
процессах.  То есть восстановление тикетов должно работать вне 
зависимости от session cache, и работать всегда.

Другой вопрос, что в стандарте про Early Data написано 
неисполнимое требование про невосстановление сессии более одного 
раза, которое как минимум OpenSSL'ем трактуется как "должна быть 
запись во встроенном кэше сессий, и при восстановлении мы её 
убираем" (что в свою очередь как раз означает поведение "работает 
только в текущем воркере, и только при использовании встроенного 
кэша сессий").  В OpenSSL это поведение с некоторых пор лечится с 
помощью флага SSL_OP_NO_ANTI_REPLAY (который nginx и  использует).

В BoringSSL раньше всей этой фигни не было, и там всё работало из 
коробки, без дополнительных приседаний.  Закоммитили какую-то 
аналогичную ерунду?

> Используйте OpenSSL, там это работает.

В части Early Data это, IMHO, очень странный совет.  Ты не 
хуже меня знаешь, через какое место в OpenSSL реализована 
поддеркжа Early Data.  То, что она вообще работает - это скорее 
случайность.

-- 
Maxim Dounin
http://mdounin.ru/


Подробная информация о списке рассылки nginx-ru