1. 首页 > MySQL教程 > 正文

MySQL教程FG038-MySQL SSL证书配置与优化

本文档风哥主要介绍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 生成自签名证书

# 生成CA证书
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 服务器端配置

# 编辑MySQL配置文件
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服务

# 重启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服务器
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设置

— 查看用户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连接

# 使用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连接

# 强制不使用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 配置优化

# 优化SSL配置
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日志

# 启用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诊断

# 检查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 配置最佳实践

# SSL配置示例
[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

风哥提示:在生产环境中,SSL配置需要根据实际情况进行调整,平衡安全性和性能。建议定期审计SSL配置,确保符合最佳实践和合规要求。
GF-MySQL数据库培训文档系列

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息