Python连接MLFlow服务器遇SSL证书验证失败问题求助
问题描述
通过SSL连接MLFlow服务器时触发证书验证错误,报错信息:
API request to ... failed with exception HTTPSConnectionPool(host='...', port=443): Max retries exceeded with url: ... (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate ( _ssl.c:1002)')))
已尝试安装本地验证文件但问题未解决,询问是否可能与MLFlow服务器端证书配置有关。连接代码如下:
os.environ['MLFLOW_TRACKING_USER'] = settings.MLFLOW_TRACKING_USER os.environ['MLFLOW_TRACKING_PASSWORD'] = settings.MLFLOW_TRACKING_PASSWORD os.environ['MLFLOW_S3_ENDPOINT_URL'] = settings.MLFLOW_S3_ENDPOINT_URL os.environ['MLFLOW_TRACKING_URI'] = settings.MLFLOW_TRACKING_URI try: mlflow.set_experiment("factoring_client_predict_fact") mlflow.start_run() # code for training a model or other operations with mlflow except Exception as e: print(f"An error occurred while establishing a connection: {e}")
问题分析
这个错误确实可能与MLFlow服务器端证书配置有关,但也存在客户端配置疏漏的可能,具体原因如下:
服务器端可能的问题
- 服务器使用自签名证书,但未配置完整的证书链(缺失中间CA证书),导致客户端无法追溯到信任的根CA
- 服务器证书的域名(CN/SAN字段)与你访问的
MLFLOW_TRACKING_URI中的域名不匹配 - 服务器SSL配置错误,未正确加载证书文件或证书已过期
客户端可能的问题(即使安装了本地证书)
- 未将服务器的根CA证书正确配置到MLFlow的信任路径中
- Python运行环境未加载你安装的本地证书(比如certifi包使用独立的证书存储)
解决步骤
1. 先验证服务器端证书配置
使用openssl命令检查服务器证书链是否完整:
openssl s_client -connect your-mlflow-host:443 -showcerts
查看输出中是否包含完整的证书链(从服务器证书到中间CA再到根CA),同时确认证书的Subject字段中的域名与你访问的MLFlow域名一致。
2. 客户端配置修复
方法一:指定MLFlow信任的CA证书路径
在代码中添加环境变量指定CA证书路径:
os.environ['MLFLOW_TRACKING_CA_CERT_PATH'] = '/path/to/your/ca-certificate.pem' # 生产环境必须关闭不安全模式 os.environ['MLFLOW_TRACKING_INSECURE_TLS'] = 'false'
方法二:临时跳过证书验证(仅限测试环境)
如果是测试环境且信任服务器,可以临时关闭证书验证:
os.environ['MLFLOW_TRACKING_INSECURE_TLS'] = 'true'
注意:生产环境绝对禁止使用此方法,会导致SSL连接失去安全性
方法三:将CA证书添加到Python默认证书存储
找到Python certifi包的证书文件路径:
import certifi print(certifi.where())
将你的CA证书内容追加到该文件末尾,这样Python所有依赖SSL的库都会信任该证书。
总结
你的报错核心是客户端无法找到签发服务器证书的信任根CA,优先排查服务器端是否配置了完整的证书链,再确认客户端是否正确加载了对应的CA证书。
内容的提问来源于stack exchange,提问作者Dumb spxxd

