WordPress 使用 X.509 验证连接数据库

一个文件解决 WordPress 原生不支持 X.509 验证连接数据库的功能缺失。

大部分的 WordPress 教程都是建议所有服务都放在同一台服务器上,作为入门使用当然足够,但随使用增多,有如下问题:

  • 一台服务器跑所有的服务,如果有多个网站,如果(因预算不高导致购买的)服务器资源不足容易导致响应速度变慢;
  • 多个网站放在不同的服务器上,每个服务器带个数据库都需要单独管理,反而增加维护复杂性。

因此将数据库在一台相对较轻量的服务器上单独运行,在数据访问频率不高、数据库非常小的情况下足够应付多个小型博客网站的架设。(在预算有限又不能内网访问的情况下)公网访问 MySQL 必然需要加密通讯,否则明文访问数据库有如裸奔,还不如不要独立的数据库了。

WordPress 长久以来(点击这里查看来源)支持 SSL 验证访问数据库,通过在 wp-config.php当中定义define( 'MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL );即可。但 SSL 验证方式仅客户端验证服务器的证书,服务器并不验证客户端证书——传输过程确实是加密了,但服务器无法验证客户端是否合法,那么假如你的数据库用户密码泄漏,SSL 验证便形同虚设。因此,在生产环境中,使用 X.509 验证,强制服务器也验证客户端证书,即便密码泄漏,证书不泄漏,数据库就是安全的。

不幸的是,WordPress 并不直接支持 X.509 验证。虽然 WordPress 开发社区十一年前已提出该问题,但相比于可见的功能性更新,这个需求并没有引起重视。

为了更安全的连接,WordPress 开发社区志愿者写了db.php 功能增强代码。基于其代码,通过时下流行的 Gemini 2.5 Pro 和 Claude Sonnet 4.5 的帮助,我组装了一个 db.php,用于 WordPress 与数据库进行 X.509 验证。本博客使用 X.509 与数据库连接。

使用方法如下:

1. 下载 db.php 并将其移动到 WordPress 程序目录下的/wp-content目录:

wget https://raw.githubusercontent.com/rebelliouswhiz/wp-secure-db/refs/heads/main/db.php

2. 修改 WordPress 目录下的wp-config.php,在/* That's all, stop editing! Happy publishing. */行前添加如下内容:

define( 'MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL );
define( 'MYSQL_SSL_KEY', '/path/to/your/client-key.pem' );
define( 'MYSQL_SSL_CERT', '/path/to/your/client-cert.pem' );
define( 'MYSQL_SSL_CA', '/path/to/your/ca-cert.pem' );

// 必须,否则会回退到 SSL 连接,不设置则默认为 true
define( 'MYSQL_SSL_VERIFY_SERVER_CERT', true );

// 可选,用于 SSL 加密算法
define( 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256' );

3. 确保db.php的权限正确:chmod 755 db.php

数据库侧也需要设置用户仅能通过 X.509 验证连接,并确保 MySQL 启动设置强制要求 SSL 连接。

使用代码可能会导致插件安装的问题,也会导致 W3 Total Cache 的数据库缓存不可用,请在使用前确保无冲突。

作者: 家园鱼

爱好的一面,技术的一面。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注