CloudFlare-R2配置mTLS
CloudFlare-R2配置mTLS
CloudFlare开启mTLS文档已经写的很明白了,但是经过我的实践,我的R2存储桶部分文件需要通过客户端身份验证才能访问,但是我发现当使用R2的自定义公共域名的时候配置mTLS就无效了,故而用本篇文章来记录。
引入
mTLS (Mutual TLS) 是标准TLS协议的扩展,在传统TLS基础上增加了客户端验证。在普通TLS中,只有服务器向客户端证明其身份;而在mTLS中,客户端也需要向服务器证明自己的身份。
但是在为R2存储桶的公共域名开启mTLS后发现无法生效,服务器不向客户端发送证书验证请求。为了解决这个问题,我考虑使用CloudFlare的Works
操作
一.新建Workers项目
在Cloudflare仪表盘的账户主页侧边栏下滑,找到Workers,选择Workers和Pages,点击创建
选择Workers的从 Hello World! 开始点击开始使用。
这时候无法编辑创建时候的项目代码,但是不用担心,点击下图所示的按钮以编辑项目代码。
- 进行编辑,删掉全部原来的内容,写入如下内容:
1 |
|
以上代码的存储桶变量名为MY_BUCKET
点击右上角的部署按钮部署项目
然后返回到你的项目主页,点击添加绑定,选择R2存储桶,再次点击添加绑定,如图所示。
我们只点击添加绑定,不复制其提供的代码,因为这个代码是PUT方法,我们下载浏览器访问并不需要PUT方法。当然如果你有需要你可以自己修改。
- 点击添加绑定后的变量名写MY BUCKET,这里写不了下划线,但是保存后自动会把空格替换成下划线。之所以写这个变量名是因为我们的代码中写的环境变量名为MY_BUCKET。然后R2存储桶选择你需要的存储桶,然后点击部署即可。
二. 为Workers项目增加自定义域名
因为使用mTLS的是我们自己的域名,因此需要为它增加自定义域名。但是与pages项目不同的是无法直接添加绑定自定义域名,需要我们自行添加Workers路由,如果你会该操作可以直接跳到第三步。
点击你的Workers项目的设置,在域和路由中复制workers.dev类型中的值,也就是你的项目域名。例如xxx.workers.dev
在Cloudflare的你的域的控制板中侧边栏的DNS中选择记录增加解析,类型选择CNAME,名称写入你自己想要的,例如我写入r2.wihi.top,目标写入刚刚你的xxx.workers.dev,代理状态一定要勾选已代理。然后点击保存即可
其实以上步骤按照网上其他人的说法随便写一个解析即可,但是我个人是这么弄的,你也可以尝试随便解析。
- 在侧边栏进入Workers路由,在HTTP路由点击添加路由,路由写入上文的r2.wihi.top/*,这里注意,**一定要写/*,不然访问其他路径不会有正确路由,**然后点击保存即可。如下图
三. 开启mTLS,并配置规则
依旧在Cloudflare的你的域的控制板的侧边栏中,选择SSL/TLS,然后点击客户端证书。
点击客户端证书中右侧的创建证书,然后进行相关提示操作即可,由于官方文档其他人的文章已经写的很详细了,这里不再赘述。但是值得一提的是,如果选择的是使用Cloudflare生成私钥和CSR。在生成后,证书格式需要复制pem格式的,以便生成PCKS12格式证书导入到电脑中。
(可选)如果你有用浏览器访问的需求,可以参考该网站的证书格式转换,这里提供使用openssl把pem格式证书转换为PCSK12。
1 |
|
- private.key: 私钥
- cert.pem: 证书
- ca_bundle.pem: 中间证书链(可选)
注意,如果要删除中间链证书,那么-certfile也需要删掉。也就是如下命令:
1 |
|
为域名启用mtls,在刚刚cloudflare控制板的客户端证书的主机处点击编辑添加需要启用mtls的域名例如上文的r2.wihi.top。值得注意的是这个域名必须开启了cloudflare代理
在客户端证书控制板中点击创建mTLS,启用WAF,拦截没有通过客户端验证的请求访问。这个已验证客户端证书,值一定是没有勾选的,也就是未通过验证的。如下图:
- 到这里相关配置已经结束了,更多内容可以参考官方文档:
四. 在Win10电脑Edge浏览器中安装客户端证书
在电脑中点击打开第三步中生成的pfx文件,一定要选择安装到用户到计算机无效.其他根据提示安装即可
在浏览器的证书管理器的你的证书中查看从window导入的证书可以看到证书导入完毕,如下图
- 然后访问开启mTLS的网站,如上文的r2.wihi.top,正常应该提示选择证书,如下图,如果没有可以尝试清除浏览器缓存重新访问
温馨提示
本篇文章着重针对的是在浏览器中使用客户端验证,你当然也可以使用其他方法,如官方的例子:
将公共证书和私有证书放在同一个目录中,使用此 cURL 命令,我们将获得访问权限:
终端窗口
1 |
|
1 |
|
如果没有证书,终端将显示以下内容:
终端窗口
1 |
|
1 |
|
如果有其他问题请查看官方文档查看指导,希望本篇内容对你有所帮助