CloudFlare-R2配置mTLS

CloudFlare-R2配置mTLS

CloudFlare开启mTLS文档已经写的很明白了,但是经过我的实践,我的R2存储桶部分文件需要通过客户端身份验证才能访问,但是我发现当使用R2的自定义公共域名的时候配置mTLS就无效了,故而用本篇文章来记录。

引入

  mTLS (Mutual TLS) 是标准TLS协议的扩展,在传统TLS基础上增加了客户端验证。在普通TLS中,只有服务器向客户端证明其身份;而在mTLS中,客户端也需要向服务器证明自己的身份。
  但是在为R2存储桶的公共域名开启mTLS后发现无法生效,服务器不向客户端发送证书验证请求。为了解决这个问题,我考虑使用CloudFlare的Works

操作

一.新建Workers项目

  1. 在Cloudflare仪表盘的账户主页侧边栏下滑,找到Workers,选择Workers和Pages,点击创建

  2. 选择Workers的从 Hello World! 开始点击开始使用

  3. 这时候无法编辑创建时候的项目代码,但是不用担心,点击下图所示的按钮以编辑项目代码。

编辑按钮

  1. 进行编辑,删掉全部原来的内容,写入如下内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
export default {
async fetch(request, env) {
// mTLS 验证
const tlsAuth = request.cf.tlsClientAuth || {};
if (!tlsAuth.certVerified || !tlsAuth.certPresented) {
return new Response("mTLS required", { status: 401 });
}

try {
const objectKey = new URL(request.url).pathname.slice(1);
const object = await env.MY_BUCKET.get(objectKey);
// 注意,这里的存储桶变量名为MY_BUCKET
if (!object) {
return new Response(`Object ${objectKey} not found`, { status: 404 });
}

const headers = new Headers();
object.writeHttpMetadata(headers);
headers.set("etag", object.httpEtag);

return new Response(object.body, { headers });

} catch (err) {
return new Response("Internal error: " + err.message, { status: 500 });
}
}
}

以上代码的存储桶变量名为MY_BUCKET

  1. 点击右上角的部署按钮部署项目

  2. 然后返回到你的项目主页,点击添加绑定,选择R2存储桶,再次点击添加绑定,如图所示。

绑定按钮

我们只点击添加绑定,不复制其提供的代码,因为这个代码是PUT方法,我们下载浏览器访问并不需要PUT方法。当然如果你有需要你可以自己修改。

R2绑定

  1. 点击添加绑定后的变量名写MY BUCKET,这里写不了下划线,但是保存后自动会把空格替换成下划线。之所以写这个变量名是因为我们的代码中写的环境变量名为MY_BUCKET。然后R2存储桶选择你需要的存储桶,然后点击部署即可。

二. 为Workers项目增加自定义域名

因为使用mTLS的是我们自己的域名,因此需要为它增加自定义域名。但是与pages项目不同的是无法直接添加绑定自定义域名,需要我们自行添加Workers路由,如果你会该操作可以直接跳到第三步。

  1. 点击你的Workers项目的设置,在域和路由中复制workers.dev类型中的值,也就是你的项目域名。例如xxx.workers.dev

  2. 在Cloudflare的你的域的控制板中侧边栏的DNS中选择记录增加解析,类型选择CNAME,名称写入你自己想要的,例如我写入r2.wihi.top,目标写入刚刚你的xxx.workers.dev,代理状态一定要勾选已代理。然后点击保存即可

其实以上步骤按照网上其他人的说法随便写一个解析即可,但是我个人是这么弄的,你也可以尝试随便解析。

  1. 在侧边栏进入Workers路由,在HTTP路由点击添加路由,路由写入上文的r2.wihi.top/*,这里注意,**一定要写/*,不然访问其他路径不会有正确路由,**然后点击保存即可。如下图

workers路由

三. 开启mTLS,并配置规则

  1. 依旧在Cloudflare的你的域的控制板的侧边栏中,选择SSL/TLS,然后点击客户端证书

  2. 点击客户端证书中右侧的创建证书,然后进行相关提示操作即可,由于官方文档其他人的文章已经写的很详细了,这里不再赘述。但是值得一提的是,如果选择的是使用Cloudflare生成私钥和CSR。在生成后,证书格式需要复制pem格式的,以便生成PCKS12格式证书导入到电脑中。

  3. (可选)如果你有用浏览器访问的需求,可以参考该网站的证书格式转换,这里提供使用openssl把pem格式证书转换为PCSK12。

1
openssl pkcs12 -export -out cert.pfx -inkey private.key -in cert.pem -certfile ca_bundle.pem
  • private.key: 私钥
  • cert.pem: 证书
  • ca_bundle.pem: 中间证书链(可选)

注意,如果要删除中间链证书,那么-certfile也需要删掉。也就是如下命令:

1
openssl pkcs12 -export -out cert.pfx -inkey private.key -in cert.pem
  1. 为域名启用mtls,在刚刚cloudflare控制板的客户端证书的主机处点击编辑添加需要启用mtls的域名例如上文的r2.wihi.top。值得注意的是这个域名必须开启了cloudflare代理

  2. 在客户端证书控制板中点击创建mTLS,启用WAF,拦截没有通过客户端验证的请求访问。这个已验证客户端证书,值一定是没有勾选的,也就是未通过验证的。如下图:

mTLS拦截规则

  1. 到这里相关配置已经结束了,更多内容可以参考官方文档:

四. 在Win10电脑Edge浏览器中安装客户端证书

  1. 在电脑中点击打开第三步中生成的pfx文件,一定要选择安装到用户到计算机无效.其他根据提示安装即可

  2. 在浏览器的证书管理器你的证书中查看从window导入的证书可以看到证书导入完毕,如下图

导入证书查看

  1. 然后访问开启mTLS的网站,如上文的r2.wihi.top,正常应该提示选择证书,如下图,如果没有可以尝试清除浏览器缓存重新访问

请求验证证书

温馨提示

  本篇文章着重针对的是在浏览器中使用客户端验证,你当然也可以使用其他方法,如官方的例子:

将公共证书和私有证书放在同一个目录中,使用此 cURL 命令,我们将获得访问权限:

终端窗口

1
curl -I --cert cert.pem --key private-cert.pem https://mtls-test.example.com/mtls-test
1
HTTP/2 200server: cloudflare

如果没有证书,终端将显示以下内容:

终端窗口

1
curl -I https://mtls-test.example.com/mtls-test
1
HTTP/2 403server: cloudflare

  如果有其他问题请查看官方文档查看指导,希望本篇内容对你有所帮助

 

鸣心/Write

CloudFlare-R2配置mTLS
https://b.wihi.top/posts/54a16023.html
作者
鸣心
发布于
2025年8月7日
许可协议