文章背景图

Cloudreve V4 配置 MySQL SSL 加密连接全记录

2026-01-01
4
- 字
- 分钟
|

下面是对你这篇文档做过「脱敏处理」后的版本,已经把具体 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:开启 TLS
  • ssl-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)
  • 防止数据库账号和数据在网络传输过程中被窃听
  • 提升整体系统安全基线,尤其是在:
    • 数据库与应用服务器不在同一台机器
    • 跨机房 / 公网访问数据库的场景

七、总结

通过以下步骤:

  1. 在 MySQL 服务器上生成并配置 SSL 证书(ssl-ca、ssl-cert、ssl-key)
  2. 根据需要启用 require_secure_transport = ON
  3. 在 Cloudreve V4 的 conf.ini 中使用 DatabaseURL,添加 tls=true 以及必要的 ssl-mode、ssl-ca 参数
  4. 重启 Cloudreve 并在 MySQL 中通过 SHOW STATUS LIKE 'Ssl_cipher'; 验证连接是否加密
  5. 如遇问题,从证书路径/权限、用户 SSL 要求、防火墙与 Debug 日志等方面入手排查

即可让 Cloudreve 与 MySQL 之间建立起 安全的 SSL/TLS 加密连接,同时避免在公开文档中泄露真实 IP 地址、用户名与密码等敏感信息。

原创

Cloudreve V4 配置 MySQL SSL 加密连接全记录

本文链接: Cloudreve V4 配置 MySQL SSL 加密连接全记录

本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

评论交流

文章目录