Skip to content

Instantly share code, notes, and snippets.

@consatan
Last active February 5, 2023 04:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save consatan/6b9cacf0a174398c81b8616fe692eb93 to your computer and use it in GitHub Desktop.
Save consatan/6b9cacf0a174398c81b8616fe692eb93 to your computer and use it in GitHub Desktop.
通过 CloudFlare 进行 HTTPS 双向认证

通过 CloudFlare 进行 HTTPS 双向认证

首先配置 CF 与 服务端的 SSL,最低要求 Flexible 级别

并在 CF 上开启强制 HTTPS(登陆 CF 后,点击相应域名,SSL/TLSEdge Certificates,勾选 Always Use HTTPSAutomatic HTTPS Rewrites)

生成证书

还是在 SSL/TLS 菜单下,点击左侧的 Client Certificates,点击 Edit 按钮添加要双向认证的域名(手动输入子域名,或者选择全域名),保存后点击右侧的 Create Certificates

如果选择的子域名没有配置 DNS,先到 CF 去配置 DNS

使用 CF 生成的证书

勾选 Generate private key and CSR with Cloudflare 并选择 RSA(2048) ,选择下面的证书有效时间,然后点击 Create

然后选择 PEM 格式的证书,保存 certificate 和 key 分别为 cert.pem cert.key

使用自己生成的证书

使用以下命令自己生成证书

openssl req -newkey rsa:4096 -keyout cert.key -out cert.csr

输入证书密码时需要记住,后续需要用到,不使用密码加密的可以直接回车。最后的 A challenge password 是证书与CA间生成随机数时的种子,设不设置都可以

Client Certificates 界面中勾选 Use my private key and CSR,然后粘贴 cert.csr 的内容到文本框,选择下面的证书有效时间,然后点击 Create

然后选择 PEM 格式的证书,保存 certificate 为 cert.pem

使用证书

回到 Client Certificates 页面,点击右侧的 Create mTLS Rule 按钮,在 Rule name 中输入规则名,比如 https client cert,并在下面的 Hostname 选择要双向认证的域名,最后点击 Deploy 按钮

使用以下命令转换 PEM 格式的证书为 PKCS#12 证书(iOS 只认这种格式的证书)

openssl pkcs12 -export -out cert.p12 -in cert.pem -inkey cert.key -passout pass:root

其中最后的 pass:root 表示证书密码为 root,该选项非必需

如果自己生成证书的,并且有设置证书密码的,需要添加 -passin pass:your_password 参数(your_password 为证书密码)

验证

cURL

curl --cert-type p12 --cert cert.p12 --pass root https://your.mtls.domain.com

其中 --pass 参数为证书密码,也可以使用 --cert cert.p12:'root' 参数。

iOS

将生成的 cert.p12 证书导入到 iOS 中,可以通过隔空投送或者 HTTP 服务器,记住,只能用 Safari 浏览器打开

打开后根据不同 iOS 版本表现可能不同,但最终都是到 设置->通用->VPN与设备管理 处安装证书,首先要输入手机锁屏密码,然后输入 pkcs12 证书密码,上例的密码即 root

使用 Safari 打开网站即可,第一次打开浏览器会提示需要证书验证是否继续。

iOS 上有且仅有Safari浏览器支持 HTTPS 双向认证

参考

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment