Superset与Keycloak HTTPS集成出现SSL证书校验失败如何解决?
问题根因
该错误本质是Superset依赖的Python HTTP客户端(requests/urllib3库)请求Keycloak的HTTPS接口时,无法校验SSL证书的签发方合法性。手动将证书导入系统CA存储不生效的核心原因是:Python默认不会读取系统的CA证书目录,而是优先使用certifi依赖包内置的CA证书集合。
排查步骤
- 先验证系统层证书是否生效:进入Superset容器执行
curl -v https://<你的Keycloak服务域名>/auth,如果curl同样返回证书校验错误,说明系统CA安装未成功,请检查挂载的根证书是否为PEM格式、后缀是否为.crt、执行update-ca-certificates时是否有成功添加证书的日志输出。 - 如果curl访问正常,验证Python层的证书校验情况:容器内执行
python3 -c "import requests; print(requests.get('https://<你的Keycloak服务域名>/auth'))",如果返回和报错一致的SSL校验失败信息,即可确认是Python运行环境的证书问题。 - 确认你的Keycloak SSL证书是否为自签名证书,或者由私有CA签发,这类证书默认不会包含在certifi的内置CA集合中。
解决方案
方案1:自定义CA导入certifi内置证书集合(生产环境推荐)
- 首先在Superset容器内执行以下命令,找到certifi的CA证书 bundle 路径:
python3 -c "import certifi; print(certifi.where())"
通常路径为/usr/local/lib/python3.<x>/site-packages/certifi/cacert.pem(为你容器内的Python小版本号) - 将你的根证书PEM内容追加到该文件末尾即可,容器部署场景可以直接通过挂载替换该文件,例如docker-compose中添加挂载配置:
./你的根证书.crt:/usr/local/lib/python3.<x>/site-packages/certifi/cacert.pem
方案2:通过环境变量指定自定义CA路径(生产环境推荐)
无需修改内置证书文件,直接给Superset容器添加以下两个环境变量即可:
REQUESTS_CA_BUNDLE=/容器内根证书挂载路径/rootCA.crt SSL_CERT_FILE=/容器内根证书挂载路径/rootCA.crt
两个变量会被requests和urllib3库自动读取,优先使用指定的CA文件做证书校验,只需提前将根证书挂载到容器对应路径即可。
方案3:关闭SSL校验(仅临时调试使用,禁止生产环境使用)
如果仅做本地调试,可以通过配置关闭SSL校验逻辑,在superset_config.py中添加如下配置:
# 允许OAuth2走非安全传输,关闭全局SSL校验警告 import os os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1' import requests requests.packages.urllib3.disable_warnings() # 在原有OAUTH_PROVIDERS配置的client_kwargs中添加verify=False参数 OAUTH_PROVIDERS = [ { 'name': 'keycloak', # 其余原有配置保持不变 'remote_app': { # 其余原有配置保持不变 'client_kwargs': { 'scope': 'openid email profile', 'verify': False # 关闭当前OAuth客户端的SSL校验 }, }, } ]
内容的提问来源于stack exchange,提问作者Manish Bansal
相关产品推荐
相关产品推荐

