CodeIgniter 本身不提供数据库连接层 SSL 加密配置,其 Encryption Service 仅用于应用层对称加密,与数据库传输层 SSL/TLS 完全无关;需在数据库配置中显式设置 mysqli.ssl-ca 等参数,并确保 MySQL 服务端已启用 SSL 且证书路径、权限正确。

CodeIgniter 本身不提供数据库连接层的 SSL 加密配置功能,encrypt 是 CodeIgniter 的独立加密服务(用于应用层数据加解密),和数据库连接的 SSL/TLS 加密通信 完全无关。你问的其实是:如何让 CodeIgniter 应用通过 SSL 加密方式连接 MySQL 数据库。
确认 MySQL 服务端已启用并验证 SSL
这是前提,CodeIgniter 只是客户端,无法“开启”服务端 SSL。必须先确保:
- MySQL 启动时正确加载了证书:检查
SHOW VARIABLES LIKE 'ssl%';,确认ssl_ca、ssl_cert、ssl_key均为非空绝对路径,且have_ssl = YES - 当前连接是否真走加密:执行
SHOW STATUS LIKE 'Ssl_cipher';,返回非空值(如DHE-RSA-AES256-SHA)才表示本次连接已加密 - 若需强制所有连接加密,可在 my.cnf 中设
require_secure_transport = ON,但务必先测试好客户端配置,否则会直接拒绝未加密连接
在 CodeIgniter 数据库配置中启用 SSL
CodeIgniter 3 和 4 都支持通过数据库配置数组传入原生 mysqli/pdo 参数。以 MySQLi 为例,在 application/config/database.php 的数据库组中添加 'encrypt' => TRUE 并补充 SSL 选项:
-
'encrypt' => TRUE:仅开启加密开关(CodeIgniter 内部识别,不是 TLS) - 真正起作用的是底层驱动参数:
'mysqli.ssl-ca'、'mysqli.ssl-cert'、'mysqli.ssl-key'(CodeIgniter 4.3+ 支持;CI3 需手动扩展或改用 PDO) - 示例(CI4):
$db['default'] = [
'DSN' => '',
'hostname' => 'db.example.com',
'username' => 'app_user',
'password' => '***',
'database' => 'myapp',
'DBDriver' => 'MySQLi',
'DBPrefix' => '',
// ... 其他常规配置
'encrypt' => true,
'mysqli.ssl-ca' => '/etc/mysql/ssl/ca.pem',
'mysqli.ssl-cert' => '/etc/mysql/ssl/client-cert.pem',
'mysqli.ssl-key' => '/etc/mysql/ssl/client-key.pem',
];
注意:客户端证书(client-cert.pem 和 client-key.pem)需由 MySQL 管理员提供或用 mysql_ssl_rsa_setup 生成(默认不生成,需额外步骤)。
客户端证书权限与连接测试要点
CodeIgniter 进程(如 Apache 或 PHP-FPM)必须能读取证书文件:
- 证书路径必须是 绝对路径,不能用
./或~ -
client-key.pem权限必须为600,属主为运行 PHP 的用户(如www-data或apache) - 测试是否生效:在控制器中执行
$this->db->query("SHOW STATUS LIKE 'Ssl_cipher'")->getRow();,检查返回值 - 若报错
SSL connection error: SSL is required but the server doesn’t support it,说明服务端未启用 SSL 或 require_secure_transport 被误开而客户端未配证书
别混淆:CodeIgniter 的 Encryption Service 不等于数据库 SSL
CodeIgniter 的 Encryption 服务(如 \Config\Encryption::key)用于对敏感字段(如用户地址、手机号)做对称加密后存入数据库,属于应用层静态加密;而数据库 SSL 是传输层动态加密,保护的是 SQL 请求与响应在网络中的明文传输。两者目标不同、层级不同、配置完全独立。
想同时使用?可以:数据库连 SSL 防窃听,再用 Encryption 对特定字段二次加密防拖库——但不要指望只配一个就能解决全部安全问题。


















