
















WordPress 作为最多人用的博客系统,其登入页面经常被爆破。我在看 Cloudflare 防火墙日志的时候也发现了很多除了我以外的访问记录。之前我写了一个文章〈个人博客适用的 Cloudflare 防火墙和缓存规则〉,来使每次访问登入页面都需要进行机器人验证。但如果你想在此基础上更安全的话,不妨按下面的步骤来添加 mTLS 用户端凭证。其它带后台的博客平台也可以使用。
2025-11-03 更新:发现 Cloudflare mTLS 规则设置中的一个较严重问题,已撤销的用户端凭证默认仍可用于验证。如果已经设置过 mTLS 规则,请翻到最后一节〈Cloudflare 设置 mTLS 规则〉查看如何修复。
一部分内容来自〈mTLS 是什麼? | 雙向驗證 TLS | Cloudflare〉
mTLS,即相互 TLS,是服务端和用户端相互验证的方法。在 mTLS 中,用户端和服务端都有一个凭证,并且双方都使用各自的公开金钥和私密金钥进行验证。与常规 TLS 相比,mTLS 需要额外的步骤来验证双方(额外的步骤以粗体显示):

因此,mTLS 可以防止中间人攻击、暴力破解密码和其他恶意请求。要使用这个功能,网站需要经过 Cloudflare 代理(打开小黄云)。
打开 Cloudflare 仪表板,在侧边栏 SSL/TLS 下找到用户端凭证,然后点「编辑」添加主机。我这边就添加了 www 子域和根域名。1在添加子域名时,只需输入子域;在添加根域名时,要输入完整根域名,如图。

添加主机后,点击蓝色的「建立凭证」按钮。算法建议选择默认的 RSA,兼容性更好。另外,我这里就将凭证的有效期设置为 1 年了,到期后需要重新创建,这个看你需求。

点击建立后,会出现两段文本,分别是凭证(公钥)和私密金钥。先不要关闭这个页面,我们需要将公钥和私钥组合为 PKCS #12 证书才能添加到浏览器和其他设备。
notepad cert.crt,会有提示说是否创建新文件,点击是。然后将第一个文本的公钥复制到打开的记事本中,保存并关闭。notepad cert.key,同样创建新文件,然后将第二个文本的私钥复制到记事本中,保存并关闭。certutil -mergepfx cert.crt cert.pfx,回车后会提示输密码,输入时不会有显示,回车后还要再输一遍确认密码。完成后,cert.pfx 文件就会生成在桌面上。首先需要安装 OpenSSL,不同发行版的安装方法自己网上查。然后分别将公钥和私钥保存到 cert.crt 和 cert.key 文件中,然后用以下命令合并,也会提示输入密码:
openssl pkcs12 -export -out cert.pfx -inkey cert.key -in cert.crt地址栏输入 chrome://certificate-manager/ 并回车,会打开浏览器的凭证管理员。点击侧边栏第二个「您的凭证」。
对于 Windows 用户,在这里点击「管理从 Windows 汇入的凭证」,再点「汇入」,下一步后,选择刚生成的 pfx 文件,2如果选择文件时没有看见的话,需要手动选择文件类型然后一直下一步即可。

对于 Linux 用户,点击「查看从 Linux 汇入的凭证」,然后点击「汇入」,选择文件即可。
在 iOS 系统上,目前应该只有 Safari 浏览器支持用户端凭证。在确保 pfx 文件加密了的情况下,用电子邮件发送到手机上,必须使用系统自带的邮件 App 接收。点击证书文件后,会提示「已安装描述档」。然后点开手机设置-已下载描述档,再点安装。安装时会先后提示输入手机解锁密码和凭证密码。


注意:本节内容已于 2025-11-03 更改,以避免已撤销的用户端凭证仍可用于验证。具体更改处本节也会说明
回到 Cloudflare 仪表板,点击工具栏的网络安全-WAF-自订规则-建立规则。

新建第一个规则(放在首位),用于封锁未验证 mTLS 证书或证书已撤销的访问,规则如下:
(not cf.tls_client_auth.cert_verified and http.request.uri.path contains "wp-admin" and ip.src ne <服务器 IP>) or (not cf.tls_client_auth.cert_verified and http.request.uri.path contains "wp-login") or (cf.tls_client_auth.cert_revoked)规则含义:
此处的规则必须使用运算式填写并保存,因为 cf.tls_client_auth.cert_revoked 这个用于判断 mTLS 证书是否已撤销的指令还不能以可视化形式添加。关于这个判断指令的说明,请参考文档。

然后添加第二个规则,放在第一个规则下面,用于解除已验证用户的一切 WAF 限制:
(cf.tls_client_auth.cert_verified and not cf.tls_client_auth.cert_revoked)规则含义:如果 mTLS 证书已验证,且证书未撤销,则跳过其他规则和其他限制。这条规则也要使用运算式填写并保存。

如果想让验证规则更严格,也可以使用 cf.tls_client_auth.cert_fingerprint_sha256 这条判断语句,即判断提交的证书指纹的 SHA256 摘要是否满足条件,详见文档。
设置好后,可以清除下 Cloudflare 的缓存,然后用浏览器访问网站后台试试,应该会弹出凭证的选择界面。如果不选择凭证,访问就会被拦截掉。对于访客来说,这个凭证窗口是不会出现的,只有在安装了的情况下才会出现。但也有个小问题,就是在访问非管理页面时也会弹出窗口。也许可以将 WordPress 登入页面放在一个新的子域名,然后修改 mTLS 主机名和规则。有需要就自行研究吧。


另外,Cloudflare 边缘服务器到原始服务器之间的连接也可以用 mTLS 保护,教程请见〈Cloudflare 设置 mTLS 验证来源拉取〉,也欢迎到我网站 主页 看看别的内容。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。