Решение проблем
Общие рекомендации
В случае проблем необходимо понимание: какой компонент действует как 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-ричных цифр).