[crit] SSL_read_early_data() failed

Sergey Kandaurov pluknet на nginx.com
Сб Фев 22 15:12:09 UTC 2020


> On 21 Feb 2020, at 22:19, mikhal123 <nginx-forum на forum.nginx.org> wrote:
> 
> Включил на своём сервере опцию "ssl_early_data". Всё вроде бы хорошо, но в
> error.log довольно много (порядка 0.5% от общего числа запросов, что на
> трафике в миллион уже немного напрягает) записей вида:
> [crit] 11016#11016: *46796 SSL_read_early_data() failed (SSL:
> error:1423D06E:SSL routines:tls_parse_ctos_server_name:bad extension) while
> SSL handshaking, client: <ip_адрес_клиента>, server: 0.0.0.0:443
> 

Было бы интересно посмотреть, что конкретно там прилетает.

> В связи с этим хотелось бы узнать:
> 1. Правильно ли я понимаю, что это проблемы со стороны клиентов (слишком
> старые клиенты?), и на сервере невозможно что-либо поделать для исправления
> этой ситуации?

Верно.  Так происходит, например, если получен испорченный SNI:
плохой тип и/или длина значения, нулевые байты в значении, плохой формат.

> 2. Если так, то с какой целью данное извещение выводится с таким высоким
> уровнем приоритета (crit)

Так происходит по умолчанию, чтобы не пропустить ничего важного.

> 3. Можно ли как-то отключить вывод данного извещения (например, понизив его
> приоритет до warn) в логи для приведения их в прежний благопристойный вид?
> 

Можно попробовать патч, понижающий уровень:

# HG changeset patch
# User Sergey Kandaurov <pluknet на nginx.com>
# Date 1582383432 -10800
#      Sat Feb 22 17:57:12 2020 +0300
# Node ID ffb1eaf3bd88886233d941e531d68785671ae457
# Parent  72b792bb3885727bf381d4c4e66cfaf754ac7a59
SSL: logging level of "bad extension".

The "bad extension" errors are reported by OpenSSL 1.1.1
if an invalid servername extension value is received.

diff --git a/src/event/ngx_event_openssl.c b/src/event/ngx_event_openssl.c
--- a/src/event/ngx_event_openssl.c
+++ b/src/event/ngx_event_openssl.c
@@ -2896,6 +2896,9 @@ ngx_ssl_connection_error(ngx_connection_
 #ifdef SSL_R_NO_SUITABLE_KEY_SHARE
             || n == SSL_R_NO_SUITABLE_KEY_SHARE                      /*  101 */
 #endif
+#ifdef SSL_R_BAD_EXTENSION
+            || n == SSL_R_BAD_EXTENSION                              /*  110 */
+#endif
 #ifdef SSL_R_NO_SUITABLE_SIGNATURE_ALGORITHM
             || n == SSL_R_NO_SUITABLE_SIGNATURE_ALGORITHM            /*  118 */
 #endif

Или конкретно для SNI:

diff --git a/src/event/ngx_event_openssl.c b/src/event/ngx_event_openssl.c
--- a/src/event/ngx_event_openssl.c
+++ b/src/event/ngx_event_openssl.c
@@ -2896,6 +2896,11 @@ ngx_ssl_connection_error(ngx_connection_
 #ifdef SSL_R_NO_SUITABLE_KEY_SHARE
             || n == SSL_R_NO_SUITABLE_KEY_SHARE                      /*  101 */
 #endif
+#ifdef SSL_R_BAD_EXTENSION
+            || (n == SSL_R_BAD_EXTENSION                             /*  100 */
+                && ERR_GET_FUNC(ERR_peek_error())
+                  == SSL_F_TLS_PARSE_CTOS_SERVER_NAME)
+#endif
 #ifdef SSL_R_NO_SUITABLE_SIGNATURE_ALGORITHM
             || n == SSL_R_NO_SUITABLE_SIGNATURE_ALGORITHM            /*  118 */
 #endif

-- 
Sergey Kandaurov



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