You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建证书实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 19:54:01