下面是对你这篇文档做过「脱敏处理」后的版本,已经把具体 IP、用户名、密码等替换为通用占位符(如 db.example.com、db_user、your_password 等):
Cloudreve V4 配置 MySQL SSL 加密连接全记录
本文记录了在 Cloudreve V4 中启用 MySQL SSL/TLS 加密连接的完整过程,包括 MySQL 服务器端配置、Cloudreve 客户端配置、验证方法以及常见问题排查。适合有一定 Linux/MySQL 基础的用户参考。
一、前提:在 MySQL 服务器上启用 SSL
Cloudreve 想要使用 SSL 连接 MySQL,前提是 MySQL 本身已经正确开启了 SSL 功能。以下操作在 MySQL 所在服务器执行。
1. 生成 SSL 证书
MySQL 自带了生成 SSL 所需证书和密钥的工具:
# 使用 MySQL 自带工具生成 SSL 相关证书和密钥
mysql_ssl_rsa_setup --datadir=/var/lib/mysql/ssl-cert --user=mysql
生成完成后,一般会在 /var/lib/mysql/ssl-cert 目录下看到类似:
ca.pem(CA 根证书)server-cert.pem(服务器证书)server-key.pem(服务器私钥)
提示:路径可以根据自己的规划调整,但要与配置文件中的路径对应。
2. 修改 MySQL 配置文件
编辑 MySQL 配置文件,例如 /etc/my.cnf 或 /etc/mysql/my.cnf:
[mysqld]
ssl-ca=/var/lib/mysql/ssl-cert/ca.pem
ssl-cert=/var/lib/mysql/ssl-cert/server-cert.pem
ssl-key=/var/lib/mysql/ssl-cert/server-key.pem
# 可选:强制所有连接必须使用 SSL
require_secure_transport = ON
保存后重启 MySQL 服务,例如:
systemctl restart mysqld
# 或
systemctl restart mysql
3. 验证 MySQL SSL 是否生效
登录 MySQL 后执行:
SHOW VARIABLES LIKE '%ssl%';
确认 have_openssl 和 have_ssl 的值为 YES,说明 SSL 支持已启用。
二、Cloudreve V4 启用 MySQL SSL 连接
Cloudreve V4 推荐通过 DatabaseURL 连接字符串 来配置数据库,这也是启用 SSL 的最简洁方式。
Cloudreve 配置文件通常为 conf.ini,重点关注 [Database] 段。
方法一:使用 DatabaseURL + tls=true(推荐)
在 conf.ini 中添加或修改如下内容:
[Database]
Type = mysql
# 当设置 DatabaseURL 后,下方的 Host、Port、User 等将被忽略
DatabaseURL = db_user:your_password@tcp(db.example.com:3306)/cloudreve_db?charset=utf8mb4&parseTime=True&loc=Local&tls=true
关键参数说明
Type = mysql:使用 MySQL 数据库DatabaseURL = ...:完整的连接字符串,遵循 Go MySQL 驱动(如go-sql-driver/mysql)的格式tls=skip-verify:- 表示为当前连接启用 SSL/TLS 加密,但跳过对服务器证书的校验(不验证证书链与主机名)
- 典型用途是测试环境或使用自签名证书但又没有正确配置 CA / 证书域名时,先保证能加密传输
- 具体行为取决于 MySQL 驱动的实现,一般会:
- 仍然通过 TLS 建立加密通道(数据是加密的)
- 但不会检查证书是否由可信 CA 签发、证书是否过期、证书中的主机名是否与连接目标匹配
- 安全性低于
tls=true(或严格模式如VERIFY_CA/VERIFY_IDENTITY),不推荐在生产环境使用,仅适合调试或临时过渡场景
tls=true:- 表示为当前连接启用 SSL/TLS 加密
- 具体行为取决于 MySQL 驱动的实现,一般会使用默认的 SSL 配置进行握手
如果需要更精细的证书控制(指定 CA 证书、验证级别等),可以在连接字符串中继续追加参数(见方法二)。
方法二:连接字符串中增加 SSL 模式与 CA 证书
如果 MySQL 端配置了更严格的验证要求(如验证 CA、验证主机名),可以在连接串中增加更多 SSL 相关参数。例如:
[Database]
Type = mysql
DatabaseURL = db_user:your_password@tcp(db.example.com:3306)/cloudreve_db?tls=true&ssl-mode=VERIFY_CA&ssl-ca=/etc/ssl/certs/ca-certificates.crt
此配置说明:
tls=true:开启 TLSssl-mode=VERIFY_CA:校验服务器证书是否由可信 CA 签发ssl-ca=/etc/ssl/certs/ca-certificates.crt:指定 CA 证书路径(由系统或你自己维护)
对应的 MySQL 命令行客户端连接方式通常为:
mysql -h db.example.com -u db_user -p \
--ssl-mode=VERIFY_IDENTITY \
--ssl-ca=/etc/ssl/certs/ca-certificates.crt
注意:
ssl-mode等参数是否支持,取决于使用的 MySQL 驱动版本及 Cloudreve 使用的具体驱动封装。实际生产前建议先在测试环境验证。
三、完整的 Cloudreve conf.ini 配置示例(脱敏)
下面是一份带有 SSL 配置的 Cloudreve conf.ini 示例,假设:
- MySQL 地址:
db.example.com:3306 - 数据库名:
cloudreve_db - 用户名:
db_user - 密码:
your_password
[System]
Mode = master
Listen = :5212
Debug = false
[Database]
Type = mysql
# 使用连接字符串启用 SSL 加密
DatabaseURL = db_user:your_password@tcp(db.example.com:3306)/cloudreve_db?charset=utf8mb4&parseTime=True&loc=Local&tls=true
# 注意:当设置了 DatabaseURL 时,下面这些将被忽略,仅作为参考注释
# Host = db.example.com
# Port = 3306
# User = db_user
# Password = your_password
# Name = cloudreve_db
# Charset = utf8mb4
如果你有自己的 CA 证书,可以扩展为:
[Database]
Type = mysql
DatabaseURL = db_user:your_password@tcp(db.example.com:3306)/cloudreve_db?charset=utf8mb4&parseTime=True&loc=Local&tls=true&ssl-mode=VERIFY_CA&ssl-ca=/path/to/ca.pem
四、配置完成后的验证与测试
1. 重启 Cloudreve
使用指定配置文件启动或重启 Cloudreve:
./cloudreve -c /path/to/conf.ini
观察终端输出或日志文件,确认没有数据库连接错误。
根据实际实现,可能会有类似提示:
[INFO] 连接到数据库...
[INFO] 数据库连接成功(SSL加密)
(具体日志内容以实际版本为准,也可以通过开启 Debug 模式查看更多细节)
2. 在 MySQL 服务端验证连接是否启用了 SSL
在 MySQL 中执行:
SHOW STATUS LIKE 'Ssl_cipher';
如果返回结果中 Ssl_cipher 字段非空(例如显示某种加密算法名称),说明当前连接是通过 SSL 加密的。
若你是通过 MySQL 客户端登录验证,需要在 Cloudreve 正在运行的情况下,用与 Cloudreve 同样的连接参数进行模拟测试(包括主机名、账号等)。
五、常见问题与故障排查
在实际配置过程中,SSL 往往容易踩坑,下面是一些常见的检查点。
1. 检查证书路径与权限
- 确保证书文件(例如
/var/lib/mysql/ssl-cert/ca.pem、server-cert.pem等)存在且未损坏 - Cloudreve 所在主机如果需要使用本地 CA 文件,必须有权限读取该文件
- MySQL 进程用户(一般为
mysql)需有权访问配置中的证书路径
建议证书权限类似:
chown mysql:mysql /var/lib/mysql/ssl-cert/*.pem
chmod 600 /var/lib/mysql/ssl-cert/server-key.pem
2. MySQL 用户是否要求 SSL
可以在 MySQL 中查看:
SELECT user, host, ssl_type FROM mysql.user;
如需对特定用户强制 SSL,可执行(示例用户与主机已脱敏):
ALTER USER 'db_user'@'app.example.com' REQUIRE SSL;
FLUSH PRIVILEGES;
上面
app.example.com为应用侧主机名,请根据自己环境替换;不要使用真实公网 IP 直接公开在文档中。
如果用户被要求必须使用 SSL,而 Cloudreve 连接串未启用 SSL,则会出现连接失败。
3. 防火墙与网络连通性
- 确保数据库服务器的 3306 端口对 Cloudreve 服务器开放
- 检查本地防火墙(如
firewalld、iptables)和云厂商安全组 - 使用
telnet或nc测试端口连通:
telnet db.example.com 3306
# 或
nc -vz db.example.com 3306
4. 启用 Cloudreve Debug 模式
如果日志信息不够详细,可以临时开启 Debug 模式:
[System]
Debug = true
然后重新启动 Cloudreve,观察日志中关于数据库连接和 TLS 的报错信息,有助于定位问题(如证书不匹配、主机名校验失败、协议不兼容等)。
六、注意事项与实践建议
1. 版本兼容性
- Cloudreve:建议使用 Cloudreve V4 及以上版本,确保支持
DatabaseURL以及tls参数 - MySQL / MariaDB:
- 建议 MySQL 5.7+ 或 MariaDB 10.2+,在 SSL/TLS 支持和稳定性上更好
- 尽量保持驱动与服务器版本的文档一致性,参考 MySQL / Go 驱动的官方说明
2. 性能影响
SSL/TLS 会带来一定的 CPU 开销,但通常可接受。对于中小规模站点,这点影响可以忽略不计;对于高并发环境,可以通过:
- 优化连接池
- 合理调整连接复用策略
- 使用更高性能的服务器硬件
来抵消影响。
3. 证书管理
- 生产环境强烈建议使用正规 CA 签发的证书,避免自签名证书带来的信任问题
- 若使用自签名证书,确保在客户端配置正确的 CA 文件,并了解自签名意味着的安全边界
- 定期检查证书有效期,提前更新,避免因证书过期导致业务中断
4. 安全收益
启用 MySQL SSL 的主要意义在于:
- 防止中间人攻击(MITM)
- 防止数据库账号和数据在网络传输过程中被窃听
- 提升整体系统安全基线,尤其是在:
- 数据库与应用服务器不在同一台机器
- 跨机房 / 公网访问数据库的场景
七、总结
通过以下步骤:
- 在 MySQL 服务器上生成并配置 SSL 证书(
ssl-ca、ssl-cert、ssl-key) - 根据需要启用
require_secure_transport = ON - 在 Cloudreve V4 的
conf.ini中使用DatabaseURL,添加tls=true以及必要的ssl-mode、ssl-ca参数 - 重启 Cloudreve 并在 MySQL 中通过
SHOW STATUS LIKE 'Ssl_cipher';验证连接是否加密 - 如遇问题,从证书路径/权限、用户 SSL 要求、防火墙与 Debug 日志等方面入手排查
即可让 Cloudreve 与 MySQL 之间建立起 安全的 SSL/TLS 加密连接,同时避免在公开文档中泄露真实 IP 地址、用户名与密码等敏感信息。