PDO连接MySQL SSL报错主因是SSL参数未正确配置或服务端证书链不完整;PDO必须通过DSN或options显式传入SSL参数,不可复用MySQLi的mysqli_ssl_set配置。

PDO连接MySQL SSL报错,核心问题通常不是证书本身,而是PDO没用对SSL参数,或服务端证书链不完整。
pdo_mysql不认mysqli_ssl_set那套配置
PDO和MySQLi是两套独立的SSL配置机制。你在MySQLi里调用mysqli_ssl_set(),对PDO完全无效;反过来也一样。PDO必须通过DSN或options数组显式传入SSL参数,否则默认走非SSL连接,哪怕MySQL服务器强制要求SSL也会直接失败。
- 错误写法(以为能复用MySQLi逻辑):
$pdo = new PDO("mysql:host=localhost;dbname=test", $user, $pass);—— 没提SSL,PDO不会自动启用 - 正确写法(DSN中声明SSL):
$pdo = new PDO("mysql:host=localhost;dbname=test;ssl_mode=REQUIRED", $user, $pass); - 更稳妥写法(用
options控制细节):$options = [ PDO::MYSQL_ATTR_SSL_CA => '/etc/mysql/ssl/ca.pem', PDO::MYSQL_ATTR_SSL_CERT => '/etc/mysql/ssl/client-cert.pem', PDO::MYSQL_ATTR_SSL_KEY => '/etc/mysql/ssl/client-key.pem', ]; $pdo = new PDO("mysql:host=localhost;dbname=test", $user, $pass, $options);
ssl_mode=REQUIRED 和 ssl_mode=VERIFY_IDENTITY 的区别
这两个值决定PDO是否校验服务器证书,直接影响安全性与兼容性:
-
ssl_mode=REQUIRED:只启用加密通道,不验证服务器证书域名或CA —— 能连上,但存在中间人风险,仅适合内网测试 -
ssl_mode=VERIFY_IDENTITY:既加密又严格校验证书的CN/SAN和可信CA —— 生产环境必须用这个,否则PDO::ATTR_ERRMODE设为EXCEPTION时会抛出SQLSTATE[HY000] [2002] SSL connection error - 注意:
VERIFY_IDENTITY要求PDO::MYSQL_ATTR_SSL_CA必须指定,且CA文件得包含根证书+所有中间证书,缺一不可
常见错误现象:PDO报“unknown ca”但命令行mysql能连
这说明MySQL服务端SSL配置没问题,问题出在PDO找不到可信CA。典型原因有三个:
立即学习“PHP免费学习笔记(深入)”;
- 系统CA路径不对:Alpine Linux容器里默认没有
/etc/ssl/certs/ca-certificates.crt,得手动挂载或指定PDO::MYSQL_ATTR_SSL_CA - CA文件权限为600但PHP运行用户(如www-data)无读取权 —— 改成644再试
- 用了自签名CA但没把根证书加到CA bundle里:执行
cat my-root-ca.crt >> /etc/ssl/certs/ca-certificates.crt && update-ca-certificates(Debian系)或cp my-root-ca.crt /etc/pki/ca-trust/source/anchors/ && update-ca-trust(RHEL系)
绕过证书校验?别在PDO里设false
有人想学cURL那样关掉校验,但在PDO里没有PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT = false这种选项。强行去掉PDO::MYSQL_ATTR_SSL_CA,又设ssl_mode=VERIFY_IDENTITY,结果就是直接报错;设ssl_mode=REQUIRED则失去身份验证能力。真正要调试,应该用openssl s_client -connect host:3306 -servername host -showcerts看服务端实际发了哪些证书,再比对本地CA bundle是否缺失中间证书。
最易被忽略的一点:PDO的SSL参数只在连接初始化时生效,后续$pdo->prepare()或query()调用不会重新协商SSL —— 所以证书路径写错、CA不全,错误一定出现在new PDO()这一行,而不是执行SQL时。



















