如何创建证书实现PHP通过SSL连接MySQL,解决unknown ca报错
MySQL SSL证书重新生成操作步骤
所有操作优先在MySQL服务端所在的服务器执行,操作前建议先备份原有证书文件。
- 步骤1:进入证书存放目录清理旧证书
# 进入你之前配置的证书目录 cd /etc/my.cnf.d/certs # 备份旧证书 mkdir -p ./old_cert && mv ./*.pem ./old_cert/
- 步骤2:生成全套SSL证书
注意:生成过程中要求输入Common Name时,CA、服务端、客户端三个的Common Name不能完全一致,否则会校验失败,其他信息可以随意填写。
# 1. 生成CA根证书私钥和根证书 openssl genrsa 2048 > ca-key.pem openssl req -new -x509 -nodes -days 3650 -key ca-key.pem -out ca.pem # 2. 生成服务端证书并签名 openssl genrsa 2048 > server-key.pem openssl req -new -key server-key.pem -out server-req.pem openssl x509 -req -in server-req.pem -days 3650 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem # 3. 生成客户端证书并签名(PHP连接时要用到) openssl genrsa 2048 > client-key.pem openssl req -new -key client-key.pem -out client-req.pem openssl x509 -req -in client-req.pem -days 3650 -CA ca.pem -CAkey ca-key.pem -set_serial 02 -out client-cert.pem
- 步骤3:调整证书权限
MySQL对证书文件权限要求严格,权限过高会导致加载失败:
chown mysql:mysql ./*.pem chmod 600 server-key.pem client-key.pem chmod 644 ca.pem server-cert.pem client-cert.pem
- 步骤4:更新MySQL配置并重启服务
编辑MySQL配置文件(通常是/etc/my.cnf或/etc/my.cnf.d/mysql-server.cnf),在[mysqld]配置段新增/修改如下内容:
[mysqld] ssl_ca = /etc/my.cnf.d/certs/ca.pem ssl_cert = /etc/my.cnf.d/certs/server-cert.pem ssl_key = /etc/my.cnf.d/certs/server-key.pem
保存后重启MySQL服务:
# MySQL 服务 systemctl restart mysqld # MariaDB 服务 # systemctl restart mariadb
重启完成后登录MySQL执行SHOW VARIABLES LIKE '%ssl%';,确认have_ssl的值为YES即说明服务端证书加载成功。
PHP连接代码修正
你当前的代码存在两处问题:一是ssl_set方法未传入CA根证书路径,二是real_connect方法的密码参数前多了多余空格。即使你使用了MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT参数,部分PHP版本仍会强制校验CA证书,建议修改为如下代码:
// 初始化连接 $new_connection = mysqli_init(); // 传入CA根证书路径 $new_connection->ssl_set( '/etc/my.cnf.d/certs/client-key.pem', '/etc/my.cnf.d/certs/client-cert.pem', '/etc/my.cnf.d/certs/ca.pem', NULL, NULL ); // 执行连接,生产环境建议移除MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT参数开启完整证书校验 $new_connection->real_connect('host', 'user', 'password', 'dbname', port, NULL, MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT);
补充说明:你之前通过命令行可以直接连接,是因为mysql客户端默认不会强制校验服务端CA证书,和PHP mysqli扩展的默认校验逻辑不同,不是证书唯一的问题。
内容的提问来源于stack exchange,提问作者kintsukuroi
相关产品推荐
相关产品推荐

