通过 Cloudflare Access 设置 mTLS 在以下情况下会对客户有所帮助:
- 设备上已存在现有的客户端证书。
- 需要通过自带 CA (BYOCA) 保护 Access 应用程序。
- 需要与 Zero Trust 解决方案集成。
CA 证书可以是来自受公信 CA 的证书,也可以是自签名的。
如果你希望从头开始创建自己的 CA,可以按照以下示例步骤操作并根据你自己的需求调整信息:
- 创建一个名为
ca-csr.json的 JSON 文件:
{
"CN": "Cloudflare Access Testing CA",
"key": {
"algo": "rsa",
"size": 4096
},
"names": [
{
"C": "US",
"L": "LA",
"O": "Access Testing",
"OU": "CA",
"ST": "California"
}
]
}- 创建一个名为
ca-config.json的 JSON 文件:
{
"signing": {
"default": {
"expiry": "8760h"
},
"profiles": {
"server": {
"usages": ["signing", "key encipherment", "server auth"],
"expiry": "8760h"
},
"client": {
"usages": ["signing", "key encipherment", "client auth"],
"expiry": "8760h"
}
}
}
}- 运行以下 cfssl 命令来生成 CA 证书
ca.pem:
cfssl gencert -initca ca-csr.json | cfssljson -bare ca- 为了创建客户端证书,你需要准备以下名为
client-csr.json的 JSON 文件:
{
"CN": "mtls-access.example.com", # 替换为你自己的主机名
"hosts": ["mtls-access.example.com"], # 替换为你自己的主机名
"key": {
"algo": "rsa",
"size": 4096
},
"names": [
{
"C": "US",
"L": "Austin",
"O": "Access",
"OU": "Access Admins",
"ST": "Texas"
}
]
}- 现在你可以运行以下命令来生成客户端证书,它将输出文件
client.pem、client-key.pem和client.csr:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client client-csr.json | cfssljson -bare client遵循 开发者文档 中概述的步骤。
使用步骤 2 中的示例:通过 仪表板 或 Cloudflare API 将 ca.pem 上传到你的 Cloudflare Access 账户。
切记输入将使用此 CA 证书的完全限定域名 (FQDN / 关联的主机名)。
客户可以通过向源站服务器转发客户端证书请求头来识别哪个客户端发送了客户端证书。然后,客户可以存储并使用证书信息(例如 Common Name (CN)、序列号和其他字段)以及设备号来执行其他检查或逻辑。
此外,通过身份验证的请求还会向源站服务器发送 Cf-Access-Jwt-Assertion JWT 请求头。要解码请求头的值,你可以使用 jwt.io ↗。
最后,你需要将要使用 mTLS 保护的主机名作为自托管 App 添加到 Cloudflare Access 中,定义一个使用操作 Service Auth 和 Selector "Valid Certificate" 的 Access 策略,或者简单地要求 IdP 身份验证。你还可以利用额外的要求,例如包含预期主机名的“Common Name”(CN),以及更多的 Selectors。或者,也可以通过外部授权和无服务器计算扩展 ZTNA。
在公钥和私钥客户端证书位于同一目录的情况下,使用以下 cURL 命令,我们将获得访问权限:
curl -IXGET --cert client.pem --key client-key.pem https://mtls-access.example.com/HTTP/2 200
server: cloudflare如果不带证书,我们将看到以下内容:
curl -I https://mtls-access.example.com/mtls-testHTTP/2 401
server: cloudflare