<div dir="ltr"><div>правка от 2017 года, просто не замечали ?</div><div><br></div><div>(или я что-то не понимаю, и проявилось только спустя 2.5 года)<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">пн, 3 февр. 2020 г. в 20:40, Maxim Dounin <<a href="mailto:mdounin@mdounin.ru">mdounin@mdounin.ru</a>>:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hello!<br>
<br>
On Mon, Feb 03, 2020 at 05:37:55PM +0300, Sergey Kandaurov wrote:<br>
<br>
> <br>
> > On 29 Jan 2020, at 15:06, Maxim Dounin <<a href="mailto:mdounin@mdounin.ru" target="_blank">mdounin@mdounin.ru</a>> wrote:<br>
> > <br>
> > Hello!<br>
> > <br>
> > On Wed, Jan 29, 2020 at 01:40:44PM +0300, Sergey Kandaurov wrote:<br>
> > <br>
> >> <br>
> >>> On 29 Jan 2020, at 06:20, Ilya Evseev <<a href="mailto:nginx-forum@forum.nginx.org" target="_blank">nginx-forum@forum.nginx.org</a>> wrote:<br>
> >>> <br>
> >>> Есть Nginx 1.17.8, собран со свежей BoringSSL stable.<br>
> >>> Запущен на Linux kernel 5.4.10:<br>
> >>> <br>
> >>> [..]<br>
> >>> SSL в Nginx'e настроен так:<br>
> >>> <br>
> >>> ssl_dhparam /etc/pki/tls/private/dhparam2048.pem;<br>
> >>> ssl_session_timeout 1h;<br>
> >>> ssl_session_cache shared:SSL:10m;<br>
> >>> ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;<br>
> >>> ssl_ciphers<br>
> >>> 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;<br>
> >>> ssl_prefer_server_ciphers on;<br>
> >>> ssl_early_data on;<br>
> >>> <br>
> >>> Проверяю, поддерживает ли он SSL early data:<br>
> >>> <br>
> >>> docker run --rm -it nablac0d3/sslyze --early_data 1.2.3.4<br>
> >>> <br>
> >>> Результат:<br>
> >>> <br>
> >>> - Если в nginx'e настроен "worker_processes 1;", sslyze всегда возвращает<br>
> >>> "Suppported - Server accepted early data"<br>
> >>> - Если воркеров больше одного, "Supported" начинает возвращаться не всегда.<br>
> >>> Чем больше воркеров - тем чаще возвращается "Not supported".<br>
> >>> <br>
> >>> Т.е. выглядит так, будто SSL Early Data поддерживает только первый воркер.<br>
> >>> <br>
> >>> Этому есть какое-то объяснение?<br>
> >> <br>
> >> Тут дело не в early data, а в том что BoringSSL по какой-то причине не<br>
> >> разрешает сохранять тикеты в session cache.  В итоге сессия восстанавливается<br>
> >> только по тикету из того же рабочего процесса, который его породил.<br>
> >> Это означает, что восстановление сессий из кеша (в т.ч. shared) не будет<br>
> >> работать и для TLSv1.2 со включёнными по умолчанию тикетами.<br>
> > <br>
> > Э.  Тикеты - восстанавливаются по ключу, который задаётся в <br>
> > master-процессе и соответственно одинаковый во всех рабочих <br>
> > процессах.  То есть восстановление тикетов должно работать вне <br>
> > зависимости от session cache, и работать всегда.<br>
> <br>
> И действительно.  В BoringSSL ключи создаются не во время вызова<br>
> SSL_CTX_new() в master-процессе, а по необходимости при работе<br>
> с тикетами, где таким образом каждый рабочий процесс получает<br>
> уникальное значение в соответствующих структурах SSL_CTX.  Это<br>
> препятствует восстановлению сессии по тикету в другом процессе.<br>
> Помимо этого, применяется механизм автовращания ключей через<br>
> SSL_DEFAULT_TICKET_KEY_ROTATION_INTERVAL секунд после создания,<br>
> но здесь это не столь важно.<br>
> <br>
> Использование коллбека SSL_CTX_set_tlsext_ticket_key_cb отменяет это.<br>
<br>
[...]<br>
<br>
> <a href="https://boringssl.googlesource.com/boringssl/+/72912d2" rel="noreferrer" target="_blank">https://boringssl.googlesource.com/boringssl/+/72912d2</a><br>
<br>
Ну э, молодцы.  То есть доступный прямо сейчас workaround для <br>
BoringSSL - задать ssl_session_ticket_key явно.  Что, конечно, <br>
делает прямо противоположное тому, что было целью авторов данного <br>
изменения - вместо вращения ключей при каждом чтении конфигурации, <br>
которое было раньше, и в пару к которому хотелось сделать <br>
автовращение, мы получаем вечно лежащий на диске ключ.<br>
<br>
Возможно, стоит подумать о том, чтобы явно отключить всю эту <br>
красоту для BoringSSL, явно задав случайные ключи при чтении <br>
конфигурации, скажем, с помощью SSL_CTX_set_tlsext_ticket_keys().<br>
<br>
Ну или сделать, наконец, автовращение ключей на уровне nginx'а, с <br>
синхронизацией ключей между рабочими процессами через разделяемую <br>
память.<br>
<br>
-- <br>
Maxim Dounin<br>
<a href="http://mdounin.ru/" rel="noreferrer" target="_blank">http://mdounin.ru/</a><br>
_______________________________________________<br>
nginx-ru mailing list<br>
<a href="mailto:nginx-ru@nginx.org" target="_blank">nginx-ru@nginx.org</a><br>
<a href="http://mailman.nginx.org/mailman/listinfo/nginx-ru" rel="noreferrer" target="_blank">http://mailman.nginx.org/mailman/listinfo/nginx-ru</a></blockquote></div>