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