Решение проблем

Общие рекомендации

В случае проблем необходимо понимание: какой компонент действует как TLS-клиент и какой действует как TLS-сервер. Сервер, Прокси и Агенты, в зависимости от взаимодействия между ними, могут действовать как в роли TLS-сервера, так и в роли TLS-клиента. Например, Сервер, который подключается к Агенту для пассивной проверки, действует как TLS-клиент. Агент действует в роли TLS-сервера. Агент, запрашивая список активных проверок с Прокси, действует как TLS-клиент. Прокси действует как TLS-сервер. Утилиты zabbix_get и zabbix_sender всегда действуют как TLS-клиенты.

Подсистема использует взаимную аутентификацию. Каждая сторона проверяет своего партнера и может отказать в соединении.Например, Сервер, подключаясь к Агенту, может немедленно закрыть соединение, если сертификат Агента ошибочен. И наоборот: Агент, принимая подключение от Сервера, может закрыть соединение, если Агент не доверяет Серверу.

Нужно исследовать файлы журналов на обеих сторонах: и TLS-клиента, и TLS-сервера. Сторона, которая отвергает соединение, может записать точную причину отказа в соединении. Другая сторона зачастую сообщает о весьма общей ошибке (например, "Connection closed by peer", "connection was non-properly terminated").

Иногда неправильно настроенное шифрование приводит к запутанным сообщениям об ошибках, не указывая реальную причину проблем.

Следует обратить внимание, что разные наборы инструментов криптографии (OpenSSL, GnuTLS) зачастую дают различные сообщения об ошибках в одних и тех же проблемных ситуациях. Иногда сообщения об ошибках зависят даже от конкретной комбинации наборов инструментов криптографии с обеих сторон.

Проблемы с типом подключения или правами

Сервер настроен на подключение с использованием PSK к Агенту, но Агент принимает только незашифрованные соединения

В журнале Сервера или Прокси (с GnuTLS 3.3.16)

Get value from agent failed: zbx_tls_connect(): gnutls_handshake() failed: \
-110 The TLS connection was non-properly terminated.

В журнале Сервера или Прокси (с OpenSSL 1.0.2c)

Get value from agent failed: TCP connection successful, cannot establish TLS to [[127.0.0.1]:10050]: \
Connection closed by peer. Check allowed connection types and access rights

Одна сторона подключается с использованием сертификата, но другая сторона принимает только PSK и наоборот

В любом журнале (с GnuTLS):

failed to accept an incoming connection: from 127.0.0.1: zbx_tls_accept(): gnutls_handshake() failed:\
-21 Could not negotiate a supported cipher suite.

В любом журнале (с OpenSSL 1.0.2c):

failed to accept an incoming connection: from 127.0.0.1: TLS handshake returned error code 1:\
file .\ssl\s3_srvr.c line 1411: error:1408A0C1:SSL routines:ssl3_get_client_hello:no shared cipher:\
TLS write fatal alert "handshake failure"

Попытка использовать sender, скомпилированный с поддержкой TLS, для отсылки данных на Сервер/Прокси, скомпилированный без TLS

В журнале на стороне инициатора соединения:

Linux:

...In zbx_tls_init_child()
...OpenSSL library (version OpenSSL 1.1.1 11 Sep 2018) initialized
...
...In zbx_tls_connect(): psk_identity:"PSK test sender"
...End of zbx_tls_connect():FAIL error:"connection closed by peer"
...send value error: TCP successful, cannot establish TLS to [[localhost]:10051]: connection closed by peer

Windows:

...OpenSSL library (version OpenSSL 1.1.1a 20 Nov 2018) initialized
...
...In zbx_tls_connect(): psk_identity:"PSK test sender"
...zbx_psk_client_cb() requested PSK identity "PSK test sender"
...End of zbx_tls_connect():FAIL error:"SSL_connect() I/O error: [0x00000000] The operation completed successfully."
...send value error: TCP successful, cannot establish TLS to [[192.168.1.2]:10051]: SSL_connect() I/O error: [0x00000000] The operation completed successfully.

В журнале на стороне, принимающей соединения:

...failed to accept an incoming connection: from 127.0.0.1: support for TLS was not compiled in

Одна сторона подключается с использованием PSK, но другая сторона использует LibreSSL или была скомпилирована без поддержки шифрования

LibreSSL не поддерживает PSK.

В журнале на стороне, инициирующей соединение:

...TCP successful, cannot establish TLS to [[192.168.1.2]:10050]: SSL_connect() I/O error: [0] Success

В журнале на стороне, принимающей соединение:

...failed to accept an incoming connection: from 192.168.1.2: support for PSK was not compiled in

В веб-интерфейсе:

Get value from agent failed: TCP successful, cannot establish TLS to [[192.168.1.2]:10050]: SSL_connect() I/O error: [0] Success

Одна сторона подключается с использованием PSK, но другая сторона использует OpenSSL с выключенной поддержкой PSK

В журнале на стороне, инициирующей соединение:

...TCP successful, cannot establish TLS to [[192.168.1.2]:10050]: SSL_connect() set result code to SSL_ERROR_SSL: file ../ssl/record/rec_layer_s3.c line 1536: error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure: SSL alert number 40: TLS read fatal alert "handshake failure"

В журнале на стороне, принимающей соединение:

...failed to accept an incoming connection: from 192.168.1.2: TLS handshake set result code to 1: file ssl/statem/statem_srvr.c line 1422: error:1417A0C1:SSL routines:tls_post_process_clien

Проблемы с сертификатами

OpenSSL используется с CRL и по некоторым CA в цепочке сертификатов их CRL не включены в TLSCRLFile

В журнале TLS-сервера в случае OpenSSL-узла:

failed to accept an incoming connection: from 127.0.0.1: TLS handshake with 127.0.0.1 returned error code 1: \
file s3_srvr.c line 3251: error:14089086: SSL routines:ssl3_get_client_certificate:certificate verify failed: \
TLS write fatal alert "unknown CA"

В журнале TLS-сервера в случае GnuTLS-узла:

failed to accept an incoming connection: from 127.0.0.1: TLS handshake with 127.0.0.1 returned error code 1: \
file rsa_pk1.c line 103: error:0407006A: rsa routines:RSA_padding_check_PKCS1_type_1:\
block type is not 01 file rsa_eay.c line 705: error:04067072: rsa routines:RSA_EAY_PUBLIC_DECRYPT:paddin

CRL истёк или истекает в процессе работы Сервера

OpenSSL, в журнале Сервера:

  • до истечения срока действия:
cannot connect to proxy "proxy-openssl-1.0.1e": TCP successful, cannot establish TLS to [[127.0.0.1]:20004]:\
SSL_connect() returned SSL_ERROR_SSL: file s3_clnt.c line 1253: error:14090086:\
SSL routines:ssl3_get_server_certificate:certificate verify failed:\
TLS write fatal alert "certificate revoked"
  • после истечения срока действия:
cannot connect to proxy "proxy-openssl-1.0.1e": TCP successful, cannot establish TLS to [[127.0.0.1]:20004]:\
SSL_connect() returned SSL_ERROR_SSL: file s3_clnt.c line 1253: error:14090086:\
SSL routines:ssl3_get_server_certificate:certificate verify failed:\
TLS write fatal alert "certificate expired"

Дело в том, что при наличии действительного CRL аннулированный сертификат записывается как "certificate revoked". При истекшем CRL сообщение об ошибке меняется на "certificate expired", которое может ввести в заблуждение.

GnuTLS, в журнале Сервера:

  • до и после истечения срока действия одинаково:
cannot connect to proxy "proxy-openssl-1.0.1e": TCP successful, cannot establish TLS to [[127.0.0.1]:20004]:\
invalid peer certificate: The certificate is NOT trusted. The certificate chain is revoked.

Самоподписанный сертификат, неизвестный CA

OpenSSL, в журнале:

error:"self signed certificate: SSL_connect() set result code to SSL_ERROR_SSL: file ../ssl/statem/statem_clnt.c\
line 1924: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed:\
TLS write fatal alert "unknown CA""

Это наблюдалось, когда сертификат Сервера по ошибке имел одну и ту же строку Issuer и Subject, хотя он был подписан CA. Издатель (Issuer) и Субъект (Subject) одинаковы в сертификате CA верхнего уровня, но не могут быть одинаковыми в сертификате Сервера (то же самое относится к сертификатам Прокси и Агента).

Проблемы с PSK

PSK содержит нечётное количество hex-цифр

Прокси или Агент не запускаются. Сообщение в журнале Прокси или Агента:

invalid PSK in file "/home/zabbix/zabbix_proxy.psk"

В GnuTLS передана строка идентификации PSK длиннее 128 байт

В журнале на стороне TLS-клиента:

gnutls_handshake() failed: -110 The TLS connection was non-properly terminated.

В журнале на стороне TLS-сервера:

gnutls_handshake() failed: -90 The SRP username supplied is illegal.

С OpenSSL 1.1.1 используется слишком длинное значение PSK

В журнале на стороне, инициирующей соединение:

...OpenSSL library (version OpenSSL 1.1.1 11 Sep 2018) initialized
...
...In zbx_tls_connect(): psk_identity:"PSK 1"
...zbx_psk_client_cb() requested PSK identity "PSK 1"
...End of zbx_tls_connect():FAIL error:"SSL_connect() set result code to SSL_ERROR_SSL: file ssl\statem\extensions_clnt.c line 801: error:14212044:SSL routines:tls_construct_ctos_early_data:internal error: TLS write fatal alert "internal error""

В журнале на стороне, принимающей соединение:

...Message from 123.123.123.123 is missing header. Message ignored.

Эта проблема возникает, когда OpenSSL обновляется с версии 1.0.x или 1.1.0 на 1.1.1, и если значение PSK длиннее чем 512-бит (64-байт PSK, введённый как 128 16-ричных цифр).