thinkphp 6 连接云 rds 启用 ssl 的关键是将证书路径与模式通过 pdo 常量键名(如 pdo::mysql_attr_ssl_ca)正确配置在 config/database.php 的 params 数组中,使用绝对路径和整数值,不可用小写字符串或相对路径。

ThinkPHP 6 连接云数据库 RDS 启用 SSL,关键不是“开启开关”,而是把 SSL 所需的证书路径和模式,通过 PDO 原生参数正确传给 MySQL 驱动。所有配置必须落在 config/database.php 的 params 数组里,不能写在 DSN 字符串中,也不能在模型或查询时动态添加。
SSL 参数必须用 PDO 常量作键名,值为服务器本地绝对路径或整数。常见错误是用了小写字符串(如 'mysql_attr_ssl_ca')或相对路径(如 ./cert/ca.pem),这些都会被忽略,导致连接失败。
params 中必须配置的 SSL 参数(以 MySQL 为例)
PDO::MYSQL_ATTR_SSL_CA→ 填 CA 证书的绝对路径,例如/data/cert/rds-ca-bundle.pem
(该证书通常从云平台控制台下载,比如华为云 RDS 的「获取 SSL 证书下载地址」API 返回链接后手动下载)PDO::MYSQL_ATTR_SSL_MODE→ 填整数,推荐设为PDO::MYSQL_ATTR_SSL_MODE_REQUIRED
(若 RDS 强制 SSL,且你只验证服务端身份、不校验域名,这个值最稳妥;VERIFY_IDENTITY要求证书 CN 匹配连接地址,内网或自定义域名场景常失败)PDO::MYSQL_ATTR_SSL_CERT和PDO::MYSQL_ATTR_SSL_KEY→ 仅当 RDS 要求双向认证(mTLS)时才需要
(绝大多数云 RDS 只要求单向认证,即客户端验证服务端,这两个参数可省略)
实际配置示例(database.php 片段)
'mysql' => [
'type' => 'mysql',
'hostname' => 'your-rds-endpoint.mysql.rds.example.com',
'database' => 'your_db',
'username' => 'your_user',
'password' => 'your_pass',
'hostport' => '3306',
'charset' => 'utf8mb4',
'prefix' => '',
'params' => [
\PDO::MYSQL_ATTR_SSL_CA => '/var/www/ssl/rds-ca-bundle.pem',
\PDO::MYSQL_ATTR_SSL_MODE => \PDO::MYSQL_ATTR_SSL_MODE_REQUIRED,
],
],
注意事项
- 证书文件必须由 PHP 进程可读,检查权限:
ls -l /var/www/ssl/rds-ca-bundle.pem,确保 web 用户(如 www-data 或 nginx)有读取权 - 不要使用 Windows 记事本编辑或另存
.pem文件,容易引入不可见字符或编码损坏 - 若报错
SQLSTATE[HY000] [2002] SSL connection error,优先确认:- RDS 实例已开启 SSL(控制台或调用
PUT /v3/{project_id}/instances/{id}/ssl接口设"ssl_option": true) -
SHOW VARIABLES LIKE '%ssl%'在 RDS 中返回have_ssl = YES - 你的数据库用户未被强制要求 X509(查
SELECT ssl_type FROM mysql.user WHERE user='xxx',若为X509,则必须提供 client cert/key)
- RDS 实例已开启 SSL(控制台或调用
不复杂但容易忽略











