Re: add header и log format не видят часть переменных $ssl xx
Maxim Dounin
mdounin на mdounin.ru
Пн Фев 10 14:24:06 UTC 2020
Hello!
On Sun, Feb 09, 2020 at 09:31:09PM -0500, Ilya Evseev wrote:
> Имеется Nginx:
>
> nginx version: nginx/1.17.8
> built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
> built with OpenSSL 1.1.0 (compatible; BoringSSL) (running with
> BoringSSL)
> TLS SNI support enabled
>
> В настройках указано:
>
> add_header X-SSLEarly $ssl_early_data always;
> add_header X-SSLSerial $ssl_client_serial always;
> add_header X-SSLCipher $ssl_cipher always;
> add_header X-SSLVStart $ssl_client_v_start always;
> add_header X-SSLProto $ssl_protocol always;
> add_header X-SNIName $ssl_server_name always;
> add_header X-SSLSessID $ssl_session_id always;
>
> Однако заголовки ответа содержат не всё:
>
> x-sslcipher: TLS_CHACHA20_POLY1305_SHA256
> x-sslproto: TLSv1.3
> x-sniname: www.test.lan
Директива add_header не добавляет заголовки с пустым содержимым.
Соответственно, в приведённом примере переменные $ssl_early_data,
$ssl_client_serial, $ssl_client_v_start и $ssl_session_id - пустые.
> Во-вторых, формат логов настроен так:
>
> log_format test "$ssl_protocol" "$ssl_server_name" "$ssl_early_data"
> "$ssl_session_reused" "$ssl_cipher"';
>
> В документации написано, что $ssl_early_data содержит либо 1, либо пустую
> строку, однако в логи пишется "-":
>
> "TLSv1.3" "www.test.lan" "-" "." "TLS_CHACHA20_POLY1305_SHA256"
>
> Хотя SSL Early Data включён и работает (проверено через sslyze, количество
> воркеров специально уменьшено до одного).
Переменная $ssl_early_data будет непустой тогда и только тогда,
когда на момент обращения к этой переменной SSL handshake не
завершён. В первую очередь она предназначена для использования
при формировании заголовка Early-Data для бэкенда (см.
http://nginx.org/r/ssl_early_data).
В момент логгирования - SSL handshake с высокой вероятностью будет
уже завершён, если только речь не идёт про совсем простые ответы
от собственно nginx'а. Соответственно нет ничего удивительного в
том, что в момент логгирования переменная пустая.
Если хочется логгировать факт использования early data в запросе
независимо от текущего статуса handshake'а - то наиболее близкое
по смыслу значение можно получить, сохраняя значение переменной
$ssl_early_data на этапе поиска конфигурации для запроса с помощью
директивы set.
Что до значения "-" вместо пустой строки при логгировании, то это
историческая особенность логгирования: "-" используется вместо
переменных, значения которых не найдены, что и происходит в случае
пустого значения $ssl_early_data.
--
Maxim Dounin
http://mdounin.ru/
Подробная информация о списке рассылки nginx-ru