Устранение ошибки проверки SSL-сертификата с кодом 210 в ClickHouse
Обычно эта ошибка выглядит так:
Code: 210. DB::NetException: SSL Exception: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED
Причина ошибки
Эта ошибка возникает при попытке подключиться к серверу ClickHouse с помощью клиента ClickHouse. Причина может быть одной из следующих:
- в файле конфигурации клиента
config.xmlотсутствует корневой CA‑сертификат из системного хранилища доверенных CA по умолчанию, или - самоподписанный или внутренний CA‑сертификат не настроен
Решение
Если используется внутренняя или самоподписанная CA, настройте корневой CA‑сертификат в config.xml в каталоге клиента (например, /etc/clickhouse-client) и отключите загрузку корневых CA‑сертификатов по умолчанию из стандартного расположения.
Ниже приведён пример конфигурации:
<openSSL>
<client>
<loadDefaultCAFile>false</loadDefaultCAFile>
<caConfig>/etc/clickhouse-server/certs/marsnet_ca.crt</caConfig>
<cacheSessions>true</cacheSessions>
<disableProtocols>sslv2,sslv3</disableProtocols>
<preferServerCiphers>true</preferServerCiphers>
<invalidCertificateHandler>
<name>RejectCertificateHandler</name>
</invalidCertificateHandler>
</client>
</openSSL>Клиенты Python на macOS
Клиенты Python сообщают об этой ошибке по-разному, обычно так:
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate
На macOS сборка Python с python.org проверяет сертификаты через стандартные пути OpenSSL, а не через системную связку ключей. При чистой установке эти пути не указывают ни на один набор корневых сертификатов: установщик включает certifi, но не связывает его со стандартным расположением OpenSSL, пока вы не запустите входящий в комплект скрипт Install Certificates.command. До этого клиент не может проверить сертификат сервера ClickHouse Cloud, хотя сам сертификат действителен. Это касается сборок python.org для macOS в целом (Python 3.6 и новее), а не только Python 3.11.
Запустите Install Certificates.command, чтобы связать certifi со стандартным путем к сертификатам OpenSSL. Скорректируйте версию в пути в соответствии с вашей установкой:
open "/Applications/Python 3.11/Install Certificates.command"В качестве альтернативы укажите клиенту пакет сертификатов certifi напрямую. ClickHouse Connect сам по себе не использует certifi в качестве резервного варианта, поэтому передайте пакет через параметр ca_cert:
import certifi
import clickhouse_connect
client = clickhouse_connect.get_client(
host='HOSTNAME.clickhouse.cloud',
port=8443,
username='default',
password='YOUR_SECRET_PASSWORD',
ca_cert=certifi.where(),
)