Codeigniter 3对接开启require_secure_transport的MySQL连接报错
CI 3适配开启require_secure_transport=ON的MySQL加密连接调整方案
核心问题原因
Codeigniter 3.1.11版本的mysqli驱动封装逻辑,和Java JDBC驱动的参数处理逻辑存在差异:
- Spring Boot使用的JDBC驱动,配置
useSSL=true时,会自动为连接启用TLS加密通道,无需额外传入证书路径等参数 - CI 3的mysqli驱动仅识别数组形式的加密配置,若直接将
encrypt设为布尔值TRUE,驱动不会主动调用mysqli扩展的SSL设置接口,连接仍走明文传输,直接触发MySQL侧require_secure_transport=ON规则的拦截报错
具体配置调整方法
直接修改现有数据库连接配置数组中的encrypt项,将原有的'encrypt' => FALSE替换为如下数组配置即可,其余原有配置项保持不变:
$db['default'] = array( 'dsn' => '', 'hostname' => 'dbhost', 'username' => 'dbusername', 'password' => 'password', 'database' => 'dbname', 'dbdriver' => 'mysqli', 'dbprefix' => '', 'pconnect' => FALSE, 'db_debug' => (ENVIRONMENT !== 'production'), 'cache_on' => FALSE, 'cachedir' => '', 'char_set' => 'utf8', 'dbcollat' => 'utf8_general_ci', 'swap_pre' => '', // 原encrypt配置替换为以下数组内容 'encrypt' => array( 'ssl_key' => '', 'ssl_cert' => '', 'ssl_ca' => '', 'ssl_capath' => '', 'ssl_cipher' => 'AES128-SHA256', 'ssl_verify' => FALSE, ), 'compress' => FALSE, 'stricton' => FALSE, 'failover' => array(), 'save_queries' => TRUE, );
配置说明
- 上述参数对齐Spring Boot侧
useSSL=true的行为:仅强制启用TLS加密传输通道,不做服务端证书的强校验 - 关键逻辑:只要驱动检测到
encrypt为数组格式,就会在连接建立前调用mysqli扩展的ssl_set()方法,让连接传输全程走加密通道,满足require_secure_transport=ON的校验要求 - 前置校验:需要确认当前PHP 7.3.11环境的mysqli扩展已集成openssl支持,可通过查看PHP扩展列表确认openssl已启用
- 若后续MySQL侧要求强制校验客户端证书,只需要在上述数组中补充对应证书路径参数(
ssl_key填客户端私钥路径、ssl_cert填客户端公钥证书路径、ssl_ca填CA根证书路径),并将ssl_verify设为TRUE即可
内容的提问来源于stack exchange,提问作者Raja
相关产品推荐
相关产品推荐

