Résolution de l’erreur de vérification du certificat SSL (code 210) dans ClickHouse
L’erreur est généralement signalée sous la forme suivante :
Code: 210. DB::NetException: SSL Exception: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED
Cause de l’erreur
Cette erreur se produit lors de la tentative de connexion à un serveur ClickHouse à l’aide de clickhouse-client. Elle est due à l’une des causes suivantes :
- le fichier de configuration du client
config.xmlne contient pas le certificat racine dans le magasin de CA par défaut de la machine, ou - un certificat de CA auto-signé ou interne n’est pas configuré
Solution
Si vous utilisez une CA interne ou autosignée, configurez le certificat racine de la CA dans le fichier config.xml du répertoire client (par ex. /etc/clickhouse-client) et désactivez le chargement des certificats racines de CA par défaut depuis leur emplacement par défaut.
Voici un exemple de configuration :
<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>Clients Python sur macOS
Les clients Python signalent cette erreur différemment, généralement sous la forme :
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate
Sur macOS, la version de Python fournie par python.org vérifie les certificats à l’aide des chemins par défaut d’OpenSSL, plutôt que via le trousseau système. Après une nouvelle installation, ces chemins ne pointent vers aucun bundle de certificats racines : l’installateur inclut certifi, mais ne le relie pas à l’emplacement par défaut d’OpenSSL tant que vous n’exécutez pas le script Install Certificates.command fourni. D’ici là, le client ne peut pas valider le certificat du serveur ClickHouse Cloud, même si ce certificat est valide. Ce problème affecte de manière générale les versions macOS de python.org (Python 3.6 et ultérieures), et pas seulement Python 3.11.
Exécutez Install Certificates.command pour relier certifi au chemin de certificat par défaut d’OpenSSL. Adaptez la version dans le chemin à votre installation :
open "/Applications/Python 3.11/Install Certificates.command"Vous pouvez aussi faire pointer directement votre client vers le bundle certifi. ClickHouse Connect ne bascule pas automatiquement sur certifi, donc transmettez le bundle via le paramètre 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(),
)Ressources complémentaires
Consultez la documentation sur la configuration de clickhouse-client.