Laravel 连接 MySQL 报 SSL certificate verify failed 是因云数据库强制 SSL 但未配置 CA 证书;需在 config/database.php 的 mysql options 中通过 PDO::MYSQL_ATTR_SSL_CA 指定正确路径的 CA 文件,并确保配置生效、证书有效且权限正确。

MySQL 连接报 SSL connection error: certificate verify failed
这是 Laravel 用 pdo_mysql 连 MySQL 时开了 sslmode=required(或 MYSQLI_CLIENT_SSL)但没配对 CA 证书的典型表现。Laravel 默认不校验证书,一旦底层驱动或 MySQL 服务端强制要求 SSL 验证,就会卡在这里。
关键不是 Laravel “要不要开 SSL”,而是你连的是不是云数据库(如 AWS RDS、阿里云 RDS、腾讯云 CDB)——它们多数默认强制 SSL,且只认自家 CA。
- 检查连接是否真走 SSL:
SHOW STATUS LIKE 'Ssl_cipher';,返回非空才说明 SSL 已启用 - 确认错误来源:在
config/database.php的mysql配置里加'options' => [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION],让错误不被静默吞掉 - 不要依赖
DB::connection()->getPdo()后手动 setAttribute,PDO 实例初始化后无法再改 SSL 参数
Laravel 8+ 怎么传 CA 证书路径给 PDO
PDO 本身不直接支持 ca、cert、key 参数,得靠 PDO::MYSQL_ATTR_SSL_CA 这类常量透传给 MySQL 客户端库。Laravel 的 mysql 配置中 options 字段就是干这个的。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 把 CA 文件(比如
rds-combined-ca-bundle.pem)放到storage/ssl/下,确保 PHP 进程有读权限 - 在
config/database.php的mysql数组里加:'options' => [ PDO::MYSQL_ATTR_SSL_CA => base_path('storage/ssl/rds-combined-ca-bundle.pem'), PDO::MYSQL_ATTR_SSL_CERT => null, PDO::MYSQL_ATTR_SSL_KEY => null, ] - 注意:Laravel 9.2+ 对
PDO::MYSQL_ATTR_SSL_*常量做了自动识别,但低版本需确保扩展已加载pdo_mysql且 MySQL 客户端库支持 SSL(php -i | grep mysql看mysqlnd行)
为什么 config/database.php 改了还是不生效
常见原因是配置没重载,或环境变量覆盖了数组配置。Laravel 的数据库配置优先级是:环境变量 > 配置文件 > 默认值,而 DB_SSL_MODE、DB_SSL_CA 这类变量 Laravel 并不原生识别。
- 别在
.env里写DB_SSL_CA=storage/ssl/ca.pem—— Laravel 不会自动把它塞进options - 运行
php artisan config:clear后再测,缓存配置会忽略你刚加的options - 如果用了 Envoyer / Forge / Env 管理工具,确认部署脚本没覆盖
config/database.php或清空了bootstrap/cache/config.php - 用
dd(DB::connection()->getConfig())检查options是否真的进了配置数组,而不是挂在别的 key 下
本地开发 vs 生产环境的证书路径差异
本地用自签名证书、生产用云厂商 CA 是常态,硬编码路径会导致部署失败。别写死 /var/www/app/storage/ssl/...。
- 统一用
base_path()或storage_path(),避免绝对路径依赖 - 开发环境可设为
null或跳过 SSL:'options' => extension_loaded('openssl') ? [ PDO::MYSQL_ATTR_SSL_CA => storage_path('ssl/' . env('DB_SSL_CA', 'rds-ca-2019-root.pem')), ] : [] - 云环境务必验证证书有效性:
openssl x509 -in storage/ssl/rds-ca-2019-root.pem -text -noout,过期的 CA 会导致连接瞬间断开,错误日志里却只显示SQLSTATE[HY000] [2002]
CA 路径错一个字符、文件权限不对、证书过期、PDO 常量拼错——这些点都容易漏,而且错误信息几乎一样,只能逐层确认。

















