本文档风哥主要介绍MySQL
8.4的SSL证书配置与优化,包括SSL概念、证书生成、MySQL配置、用户设置、连接测试、性能优化和问题排查等内容。风哥教程参考MySQL官方文档SSL连接部分。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 SSL概述
SSL(Secure Sockets Layer)是一种用于在网络通信中提供加密和身份验证的安全协议。MySQL支持SSL连接,可以加密客户端和服务器之间的通信,提高数据传输的安全性。学习交流加群风哥微信:
itpux-com
1.1.1 SSL的重要性
启用SSL可以:
- 加密数据传输,防止数据被窃听
- 验证服务器身份,防止中间人攻击
- 提高数据传输的完整性,防止数据被篡改
- 满足合规要求,如PCI DSS等
1.2 MySQL SSL支持
1.2.1 SSL功能
MySQL SSL提供以下核心功能:
- 数据加密:加密客户端和服务器之间的通信内容
- 服务器身份验证:客户端验证服务器的身份,防止中间人攻击
- 客户端身份验证:服务器验证客户端的身份,增强访问控制
- 证书管理:提供SSL证书和密钥的配置与管理机制
1.2.2 SSL版本
MySQL支持以下SSL版本:
- TLS 1.0:较旧版本,安全性较低
- TLS 1.1:中间版本
- TLS 1.2:推荐使用,安全性较高
- TLS 1.3:最新版本,安全性最高
Part02-生产环境规划与建议
2.1 SSL证书类型选择
在生产环境中,SSL证书的选择需要考虑安全性、成本和管理复杂度:
- 自签名证书:免费,但不被浏览器信任,适用于内部测试环境
- 企业内部CA证书:由企业内部CA签发,适用于企业内部网络
- 公共CA证书:由受信任的公共CA签发,适用于面向公众的服务
2.2 SSL性能与安全平衡
启用SSL会带来一定的性能开销,需要在安全性和性能之间取得平衡:
- 选择高效的加密算法和密码套件
- 合理配置SSL会话缓存
- 考虑使用硬件加速
- 只对敏感数据传输启用SSL
Part03-生产环境项目实施方案
3.1 SSL证书生成
3.1.1 生成自签名证书
openssl genrsa 2048 > ca-key.pem
Generating RSA private key, 2048 bit long modulus
……………………………………………………………………………………………………………………………………+++
…………………………………………………………+++
e is 65537 (0x10001)
# 生成CA证书
openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Beijing
Locality Name (eg, city) []:Beijing
Organization Name (eg, company) [Internet Widgits Pty Ltd]:FGEDU
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:ca.fgedu.net
Email Address []:
# 生成服务器证书
openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem
Generating a 2048 bit RSA private key
………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………….+++
………….+++
e is 65537 (0x10001)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Beijing
Locality Name (eg, city) []:Beijing
Organization Name (eg, company) [Internet Widgits Pty Ltd]:FGEDU
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:mysql.fgedu.net
Email Address []:
# 处理服务器私钥
openssl rsa -in server-key.pem -out server-key.pem
writing RSA key
# 生成服务器证书
openssl x509 -req -in server-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out
server-cert.pem
Signature ok
subject=/C=CN/ST=Beijing/L=Beijing/O=FGEDU/OU=IT/CN=mysql.fgedu.net
Getting CA Private Key
# 生成客户端证书
openssl req -newkey rsa:2048 -days 3600 -nodes -keyout client-key.pem -out client-req.pem
Generating a 2048 bit RSA private key
………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………….+++
………….+++
e is 65537 (0x10001)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Beijing
Locality Name (eg, city) []:Beijing
Organization Name (eg, company) [Internet Widgits Pty Ltd]:FGEDU
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:client.fgedu.net
Email Address []:
# 处理客户端私钥
openssl rsa -in client-key.pem -out client-key.pem
writing RSA key
# 生成客户端证书
openssl x509 -req -in client-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out
client-cert.pem
Signature ok
subject=/C=CN/ST=Beijing/L=Beijing/O=FGEDU/OU=IT/CN=client.fgedu.net
Getting CA Private Key
3.1.2 验证证书
openssl verify -CAfile ca.pem server-cert.pem
server-cert.pem: OK
# 验证客户端证书
openssl verify -CAfile ca.pem client-cert.pem
client-cert.pem: OK
3.1.3 证书存储
mkdir -p /etc/mysql/ssl
# 复制证书到目录
cp ca.pem server-cert.pem server-key.pem /etc/mysql/ssl/
# 设置权限
chown mysql:mysql /etc/mysql/ssl/*
chmod 600 /etc/mysql/ssl/*
# 验证权限
ls -la /etc/mysql/ssl/
total 20
drwxr-xr-x. 2 mysql mysql 60 Apr 1 16:00 .
drwxr-xr-x. 3 mysql mysql 18 Apr 1 16:00 ..
-rw——-. 1 mysql mysql 1184 Apr 1 16:00 ca.pem
-rw——-. 1 mysql mysql 1294 Apr 1 16:00 server-cert.pem
-rw——-. 1 mysql mysql 1675 Apr 1 16:00 server-key.pem
3.2 MySQL SSL配置
3.2.1 服务器端配置
vi /etc/my.cnf
[mysqld]
# 启用SSL
ssl=ON
# SSL证书文件
ssl_ca=/etc/mysql/ssl/ca.pem
ssl_cert=/etc/mysql/ssl/server-cert.pem
ssl_key=/etc/mysql/ssl/server-key.pem
# 允许的SSL密码套件
ssl_cipher=ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256
# TLS版本
tls_version=TLSv1.2,TLSv1.3
# 启用SSL会话缓存
ssl_session_cache_size=10M
ssl_session_cache_mode=ON
3.2.2 客户端配置
vi /etc/my.cnf.d/client.cnf
[client]
# 启用SSL
ssl=ON
# SSL证书文件
ssl_ca=/etc/mysql/ssl/ca.pem
ssl_cert=/etc/mysql/ssl/client-cert.pem
ssl_key=/etc/mysql/ssl/client-key.pem
# 验证服务器证书
ssl-verify-server-cert=ON
3.2.3 重启MySQL服务
systemctl restart mysqld
Job for mysqld.service restarted successfully.
# 检查SSL状态
mysql -u root -p -e “SHOW VARIABLES LIKE ‘%ssl%’;”
Enter password: Fgedu123!
+—————+—————–+
| Variable_name | Value |
+—————+—————–+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | /etc/mysql/ssl/ca.pem |
| ssl_capath | |
| ssl_cert | /etc/mysql/ssl/server-cert.pem |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | /etc/mysql/ssl/server-key.pem |
+—————+—————–+
3.3 SSL用户配置
3.3.1 创建需要SSL的用户
mysql -u root -p
Enter password: Fgedu123!
— 创建需要SSL的用户
CREATE USER ‘ssl_user’@’localhost’ IDENTIFIED BY ‘Fgedu123!’ REQUIRE SSL;
Query OK, 0 rows affected (0.01 sec)
— 创建需要特定客户端证书的用户
CREATE USER ‘cert_user’@’localhost’ IDENTIFIED BY ‘Fgedu123!’ REQUIRE X509;
Query OK, 0 rows affected (0.00 sec)
— 创建需要特定主题的用户
CREATE USER ‘subject_user’@’localhost’ IDENTIFIED BY ‘Fgedu123!’ REQUIRE SUBJECT
‘/C=CN/ST=Beijing/L=Beijing/O=FGEDU/OU=IT/CN=client.fgedu.net’;
Query OK, 0 rows affected (0.01 sec)
— 创建需要特定 issuer 的用户
CREATE USER ‘issuer_user’@’localhost’ IDENTIFIED BY ‘Fgedu123!’ REQUIRE ISSUER
‘/C=CN/ST=Beijing/L=Beijing/O=FGEDU/OU=IT/CN=ca.fgedu.net’;
Query OK, 0 rows affected (0.00 sec)
3.3.2 修改现有用户
CREATE USER ‘test_user’@’localhost’ IDENTIFIED BY ‘Fgedu123!’;
Query OK, 0 rows affected (0.01 sec)
— 修改现有用户需要SSL
ALTER USER ‘test_user’@’localhost’ REQUIRE SSL;
Query OK, 0 rows affected (0.00 sec)
— 修改现有用户不需要SSL
ALTER USER ‘test_user’@’localhost’ REQUIRE NONE;
Query OK, 0 rows affected (0.01 sec)
3.3.3 查看用户SSL设置
SELECT user, host, ssl_type, ssl_cipher, x509_issuer, x509_subject
FROM mysql.user
WHERE user IN (‘ssl_user’, ‘cert_user’);
+———-+———–+———-+————+————-+————–+
| user | host | ssl_type | ssl_cipher | x509_issuer | x509_subject |
+———-+———–+———-+————+————-+————–+
| cert_user| localhost | X509 | | NULL | NULL |
| ssl_user | localhost | ANY | | NULL | NULL |
+———-+———–+———-+————+————-+————–+
Part04-生产案例与实战讲解
4.1 SSL连接测试
4.1.1 测试SSL连接
mysql -u ssl_user -p –ssl-ca=/etc/mysql/ssl/ca.pem –ssl-cert=/etc/mysql/ssl/client-cert.pem
–ssl-key=/etc/mysql/ssl/client-key.pem
Enter password: Fgedu123!
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.4.0 MySQL Community Server – GPL
Copyright (c) 2000, 2026, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.
# 检查连接是否使用SSL
mysql> STATUS;
————–
mysql Ver 8.4.0 for Linux on x86_64 (MySQL Community Server – GPL)
Connection id: 10
Current database:
Current user: ssl_user@localhost
SSL: Cipher in use is ECDHE-RSA-AES128-GCM-SHA256
Current pager: stdout
Using outfile: ”
Using delimiter: ;
Server version: 8.4.0 MySQL Community Server – GPL
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: utf8mb4
Conn. characterset: utf8mb4
UNIX socket: /var/lib/mysql/mysql.sock
Binary data as: Hexadecimal
Uptime: 10 min 20 sec
Threads: 2 Questions: 25 Slow queries: 0 Opens: 130 Flush tables: 3 Open tables: 40 Queries per second avg:
0.040
————–
# 或
mysql> SHOW SESSION STATUS LIKE ‘Ssl_cipher’;
+—————+————————+
| Variable_name | Value |
+—————+————————+
| Ssl_cipher | ECDHE-RSA-AES128-GCM-SHA256 |
+—————+————————+
1 row in set (0.00 sec)
4.1.2 测试非SSL连接
mysql -u ssl_user -p –ssl-mode=DISABLED
Enter password: Fgedu123!
ERROR 1045 (28000): Access denied for user ‘ssl_user’@’localhost’ (using password: YES)
# 因为ssl_user需要SSL连接,所以非SSL连接会失败
# 使用不需要SSL的用户测试非SSL连接
mysql -u root -p –ssl-mode=DISABLED
Enter password: Fgedu123!
Welcome to the MySQL monitor. Commands end with ; or \g.
mysql> SHOW SESSION STATUS LIKE ‘Ssl_cipher’;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| Ssl_cipher | |
+—————+——-+
1 row in set (0.00 sec)
4.1.3 SSL模式设置
MySQL支持以下SSL模式:
- DISABLED:不使用SSL
- PREFERRED:优先使用SSL,如果服务器不支持则使用非SSL
- REQUIRED:必须使用SSL,如果服务器不支持则连接失败
- VERIFY_CA:必须使用SSL,并验证CA证书
- VERIFY_IDENTITY:必须使用SSL,并验证CA证书和服务器主机名
4.2 SSL性能优化
4.2.1 性能影响
启用SSL会对MySQL性能产生一定影响,主要体现在:
- CPU开销:加密和解密操作需要CPU资源
- 网络开销:加密后数据量增加
- 连接建立时间:SSL握手过程增加连接建立时间
4.2.2 性能优化策略
- 使用硬件加速:使用支持SSL硬件加速的服务器
- 优化SSL配置:选择高效的密码套件
- 使用连接池:减少SSL握手次数
- 合理设置会话缓存:减少SSL会话重建
- 选择性使用SSL:只对敏感数据使用SSL
4.2.3 配置优化
vi /etc/my.cnf
[mysqld]
# 优化SSL密码套件
ssl_cipher=ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256
# 使用安全的TLS版本
tls_version=TLSv1.2,TLSv1.3
# 启用会话缓存
ssl_session_cache_size=10M
ssl_session_cache_mode=ON
# 重启MySQL服务
systemctl restart mysqld
# 验证SSL会话缓存配置
mysql -u root -p -e “SHOW VARIABLES LIKE ‘ssl_session%’;”
Enter password: Fgedu123!
+———————+———-+
| Variable_name | Value |
+———————+———-+
| ssl_session_cache_mode | ON |
| ssl_session_cache_size | 10485760 |
+———————+———-+
4.3 SSL问题排查
4.3.1 常见SSL问题
常见SSL问题及解决方案:
- SSL连接失败
- 可能原因:证书配置错误
- 解决方案:检查证书路径和权限
- 证书验证失败
- 可能原因:CA证书不匹配
- 解决方案:确保使用正确的CA证书
- SSL握手超时
- 可能原因:网络问题或证书问题
- 解决方案:检查网络连接和证书
- 性能下降
- 可能原因:SSL开销过大
- 解决方案:优化SSL配置
4.3.2 SSL日志
vi /etc/my.cnf
[mysqld]
log_error=/var/log/mysql/error.log
error_log_verbosity=3
# 重启MySQL服务
systemctl restart mysqld
4.3.3 SSL诊断
mysql -u root -p -e “SHOW VARIABLES LIKE ‘%ssl%’;”
Enter password: Fgedu123!
+—————+—————–+
| Variable_name | Value |
+—————+—————–+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | /etc/mysql/ssl/ca.pem |
| ssl_cert | /etc/mysql/ssl/server-cert.pem |
| ssl_key | /etc/mysql/ssl/server-key.pem |
+—————+—————–+
# 检查SSL会话状态
mysql -u root -p -e “SHOW SESSION STATUS LIKE ‘Ssl%’;”
Enter password: Fgedu123!
+———————+————————+
| Variable_name | Value |
+———————+————————+
| Ssl_cipher | ECDHE-RSA-AES128-GCM-SHA256 |
| Ssl_cipher_list | ECDHE-RSA-AES256-GCM-SHA384:… |
| Ssl_verify_mode | VERIFY_CA |
| Ssl_session_cache_mode | ON |
| Ssl_session_cache_overflows | 0 |
| Ssl_session_cache_hits | 0 |
| Ssl_session_cache_misses | 0 |
| Ssl_session_cache_size | 10485760 |
| Ssl_session_cache_timeouts | 0 |
+———————+————————+
# 测试SSL连接
openssl s_client -connect localhost:3306 -CAfile /etc/mysql/ssl/ca.pem
CONNECTED(00000003)
depth=1 C = CN, ST = Beijing, L = Beijing, O = FGEDU, OU = IT, CN = ca.fgedu.net
verify return:1
depth=0 C = CN, ST = Beijing, L = Beijing, O = FGEDU, OU = IT, CN = mysql.fgedu.net
verify return:1
—
Certificate chain
0 s:/C=CN/ST=Beijing/L=Beijing/O=FGEDU/OU=IT/CN=mysql.fgedu.net
i:/C=CN/ST=Beijing/L=Beijing/O=FGEDU/OU=IT/CN=ca.fgedu.net
—
Server certificate
—–BEGIN CERTIFICATE—–
…
—–END CERTIFICATE—–
…
Part05-风哥经验总结与分享
5.1 SSL最佳实践
5.1.1 生产环境SSL配置建议
- 使用正式CA证书:使用受信任的CA签发的证书,避免使用自签名证书
- 定期更新证书:设置证书到期提醒,避免证书过期导致服务中断
- 使用强密码套件:选择安全的密码套件,禁用弱密码算法
- 启用TLS 1.2或更高版本:禁用过时的TLS版本,提高安全性
- 配置客户端验证:对敏感服务启用客户端证书验证,提高安全性
5.1.2 配置最佳实践
[mysqld]
# 启用SSL
ssl=ON
# SSL证书文件
ssl_ca=/etc/mysql/ssl/ca.pem
ssl_cert=/etc/mysql/ssl/server-cert.pem
ssl_key=/etc/mysql/ssl/server-key.pem
# SSL配置优化
ssl_cipher=ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256
tls_version=TLSv1.2,TLSv1.3
ssl_session_cache_size=10M
ssl_session_cache_mode=ON
5.1.3 安全最佳实践
- 保护私钥:确保私钥文件的安全,设置严格的权限
- 限制SSL访问:只允许受信任的客户端连接,使用防火墙限制访问
- 监控SSL连接:定期检查SSL连接状态,监控证书过期时间
- 审计SSL配置:定期审计SSL配置的安全性,确保符合最佳实践
5.2 常见问题解答
在配置MySQL SSL时,经常会遇到以下问题:
- 证书权限问题:确保MySQL用户有访问证书文件的权限,建议设置为600权限
- 证书路径问题:确保配置文件中指定的证书路径正确
- TLS版本不兼容:确保客户端和服务器支持相同的TLS版本
- 性能影响:启用SSL会带来一定的性能开销,可以通过优化配置和使用硬件加速来缓解
总结
MySQL的SSL证书配置与优化是提高数据库安全性的重要措施。通过启用SSL,可以加密客户端和服务器之间的通信,防止数据被窃听和篡改,提高数据传输的安全性。学习交流加群风哥微信: itpux-com
在实际生产环境中,建议使用受信任的CA签发的证书,定期更新证书,选择安全的密码套件,启用TLS
1.2或更高版本,并配置客户端验证,以提高系统的安全性。同时,要注意SSL对性能的影响,采取相应的优化措施,确保系统的性能和安全性达到平衡。更多视频教程www.fgedu.net.cn
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
