SSL证书验证失败主因是客户端未正确加载服务端信任的CA证书,需显式指定--ssl-ca与--ssl-mode=VERIFY_IDENTITY,云数据库必须用控制台下载的专用CA证书,JDBC需配置trustCertificateKeyStoreUrl等参数,JVM版本过低或证书链不完整亦会导致SSLHandshakeException。

SSL证书验证失败不是该关SSL,而是客户端没拿到服务端信任的CA证书——连不上根本不是加密问题,是身份校验卡住了。
MySQL命令行连不上:ssl-mode和--ssl-ca填错位置
mysql命令行默认启用SSL,但不自动校验证书。报SSL connection error或unknown ca时,关键看两个参数是否显式指定:
-
--ssl-mode=VERIFY_IDENTITY必须配合--ssl-ca=/path/to/ca.pem,缺一不可 - 只写
--ssl-mode=REQUIRED不带--ssl-ca,等于告诉MySQL“只要加密,别管是谁”,生产环境禁用 - 路径必须是绝对路径,
~或相对路径在某些shell里会解析失败 - 阿里云RDS、腾讯云CDB等云数据库必须用控制台下载的
RDS-Global-Bundle.pem或aliyun-rds-ca-cert.pem,不能用mysql_ssl_rsa_setup生成的本地证书
DBeaver/JDBC连报javax.net.ssl.SSLHandshakeException
错误日志里出现javax.net.ssl.SSLHandshakeException,基本锁定在JVM加载证书环节:
- DBeaver:连接编辑页 →
Driver properties→ 找到sslTrustCertificate,填绝对路径(如/home/user/certs/aliyun-rds-ca-cert.pem),同时确认useSSL=true且sslMode=REQUIRED - JDBC URL里不能只靠
sslMode=REQUIRED,必须显式传入trustCertificateKeyStoreUrl和trustCertificateKeyStorePassword,例如:jdbc:mysql://xxx:3306/db?sslMode=REQUIRED&trustCertificateKeyStoreUrl=file:/tmp/rds-ca.pem&trustCertificateKeyStorePassword=changeit - JVM版本太老(如Java 8u151之前)不支持TLSv1.2,而MySQL 8.0+默认协商TLSv1.2,需升级JVM或在JDBC URL加
enabledTLSProtocols=TLSv1.2
PDO连接MySQL抛SQLSTATE[HY000] [2002] SSL connection error
PDO和MySQLi的SSL配置完全不互通,mysqli_ssl_set()对PDO无效:
- DSN里必须带
ssl_mode=VERIFY_IDENTITY,仅ssl_mode=REQUIRED不够——它不校验证书,但服务端若设了require_secure_transport=on,PDO仍会因未满足校验要求而断连 -
PDO::MYSQL_ATTR_SSL_CA必须指向完整CA bundle,Alpine Linux容器里默认没有/etc/ssl/certs/ca-certificates.crt,得手动挂载或指定路径 - 证书文件权限为600但PHP运行用户(如
www-data)无读取权,改成644再试 - 自签名CA必须合并进系统CA bundle:
cat my-root-ca.crt >> /etc/ssl/certs/ca-certificates.crt && update-ca-certificates(Debian系)
pip install mysqlclient报SSL: CERTIFICATE_VERIFY_FAILED
这不是MySQL的问题,是pip自己连PyPI时SSL验证失败,99%是系统时间错或certifi过期:
- 先执行
date,如果时间偏差超过几分钟,立刻同步:sudo ntpdate -s time.nist.gov(Linux)或sudo sntp -sS time.apple.com(macOS) - 更新certifi:
pip install --upgrade certifi,它会刷新Python内置的CA证书库 - macOS上python.org安装的Python常找不到系统Keychain证书,可临时指定:
pip install --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org mysqlclient,但只是临时绕过,非根治 - 企业内网若部署了HTTPS中间人代理,需把公司根证书导出并加入certifi bundle,再重装mysqlclient
真正难搞的是证书链不完整:服务端证书没附带中间CA,或客户端CA bundle里缺了某一级签发者——这种问题不会报明确错误,只会静默失败,得用openssl s_client -connect host:3306 -showcerts抓握手过程看实际返回的证书链。


















