Como resolver o erro de verificação de certificado SSL, código 210, no ClickHouse
O erro geralmente é exibido como:
Code: 210. DB::NetException: SSL Exception: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED
Causa do erro
Este erro ocorre ao tentar se conectar a um servidor ClickHouse usando clickhouse-client. A causa do erro é uma das seguintes:
- o arquivo de configuração do cliente,
config.xml, não inclui o certificado raiz no repositório padrão de CAs da máquina; ou - há um certificado de CA autossinado ou de uma CA interna que não está configurado
Solução
Se estiver usando uma CA interna ou autossinada, configure o certificado raiz da CA em config.xml, no diretório do cliente (por exemplo, /etc/clickhouse-client), e desative o carregamento, a partir do local padrão, dos certificados raiz de CA padrão.
Veja um exemplo de configuração:
<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>Clientes Python no macOS
Os clientes Python relatam esse erro de forma diferente, normalmente assim:
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate
No macOS, a compilação do Python distribuída pelo python.org verifica certificados usando os caminhos padrão do OpenSSL, em vez do chaveiro do sistema. Em uma instalação nova, esses caminhos não apontam para nenhum pacote de certificados raiz: o instalador inclui certifi, mas não o vincula ao local padrão do OpenSSL até que você execute o script incluído Install Certificates.command. Até lá, o cliente não consegue validar o certificado do servidor do ClickHouse Cloud, mesmo que esse certificado seja válido. Isso afeta as compilações do python.org para macOS em geral (Python 3.6 e versões posteriores), não apenas o Python 3.11.
Execute Install Certificates.command para vincular o certifi ao caminho padrão de certificados do OpenSSL. Ajuste a versão no caminho para corresponder à sua instalação:
open "/Applications/Python 3.11/Install Certificates.command"Como alternativa, aponte seu cliente diretamente para o pacote do certifi. ClickHouse Connect não usa o certifi automaticamente como alternativa, portanto passe o pacote pelo parâmetro 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(),
)Recursos adicionais
Consulte a documentação de configuração do clickhouse-client.