配置MySQL SSL连接的核心步骤:1. 生成CA证书、私钥和服务器证书:使用openssl命令如openssl genrsa -out ca-key.pem 2048; openssl req -new -x509 -days 3650 -key ca-key.pem -out ca.pem; openssl req -newkey rsa:2048 -days 3650 -nodes -keyout 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。2. 将证书文件放置到MySQL数据目录,如/etc/mysql/ssl/。3. 编辑my.cnf配置文件,在[mysqld]下添加require_secure_transport=ON和ssl_ca=ca.pem ssl_cert=server-cert.pem ssl_key=server-key.pem。4. 重启MySQL服务:systemctl restart mysql。5. 客户端连接使用mysql -u root -p --ssl-ca=ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem。测试:SHOW STATUS LIKE 'Ssl_cipher'; 显示有值即成功,确保传输加密无泄露风险。
生成证书步骤详解
首先创建服务器证书和密钥:openssl genrsa 2048 > server-key.pem; openssl req -new -x509 -key server-key.pem -out server-cert.pem -days 3650。接着创建CA:openssl genrsa 2048 > ca-key.pem; openssl req -new -x509 -key ca-key.pem -days 3650 -out ca.pem。客户端证书:openssl req -newkey rsa:2048 -days 3650 -nodes -keyout 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 01 -out client-cert.pem。将这些文件复制到MySQL的ssl目录,重启后在mysql命令行输入STATUS; 查看Ssl_cipher不为NULL即启用成功。
MySQL配置SSL参数
在my.cnf的[mysqld]部分添加:ssl-ca=/path/to/ca.pem ssl-cert=/path/to/server-cert.pem ssl-key=/path/to/server-key.pem。客户端在[mysql]下添加ssl-ca、ssl-cert、ssl-key路径。强制使用SSL:require_secure_transport=ON。验证连接:mysql> STATUS; 看Ssl_cipher: AES256-SHA 等表示加密生效。避免数据在网络中明文传输的风险。
客户端连接测试
使用命令:mysql -h hostname -u user -p --ssl-mode=REQUIRED --ssl-ca=ca.pem。或者在程序中如PHP的PDO:$pdo = new PDO('mysql:host=localhost;dbname=test', $user, $pass, [PDO::MYSQL_ATTR_SSL_CA => 'ca.pem']);。Java JDBC:jdbc:mysql://host:3306/db?useSSL=true&requireSSL=true&verifyServerCertificate=true&trustCertificateKeyStoreUrl=file:/path/to/keystore&trustCertificateKeyStorePassword=password。成功后传输数据全加密。
常见问题排查
如果Ssl_cipher为空,检查证书路径是否正确、权限是否755、my.cnf语法无误、重启服务。日志查看:tail -f /var/log/mysql/error.log 找SSL相关错误。证书过期用openssl x509 -in server-cert.pem -text -noout 检查日期。
性能与安全权衡
SSL会略微增加CPU开销,但对现代硬件影响小。推荐生产环境强制开启,开发环境可选。结合防火墙和VPN双重保障传输安全。
FAQ
Q: 如何检查MySQL是否启用了SSL?
A: 执行SHOW STATUS LIKE 'Ssl_%'; 或STATUS; 查看Ssl_cipher是否有值。
Q: 证书生成失败怎么办?
A: 确保openssl安装,目录有写权限,命令路径正确。
Q: 客户端连接拒绝SSL?
A: 检查--ssl-ca路径和证书匹配,服务器require_secure_transport设置。
Q: SSL影响性能吗?
A: 轻微增加加密开销,建议用ECDHE cipher suite优化。