首先配置 CF 与 服务端的 SSL,最低要求 Flexible 级别
并在 CF 上开启强制 HTTPS(登陆 CF 后,点击相应域名,SSL/TLS,Edge Certificates,勾选 Always Use HTTPS 和 Automatic HTTPS Rewrites)
还是在 SSL/TLS 菜单下,点击左侧的 Client Certificates,点击 Edit 按钮添加要双向认证的域名(手动输入子域名,或者选择全域名),保存后点击右侧的 Create Certificates
如果选择的子域名没有配置
DNS,先到 CF 去配置DNS
勾选 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 --cert-type p12 --cert cert.p12 --pass root https://your.mtls.domain.com其中 --pass 参数为证书密码,也可以使用 --cert cert.p12:'root' 参数。
将生成的 cert.p12 证书导入到 iOS 中,可以通过隔空投送或者 HTTP 服务器,记住,只能用 Safari 浏览器打开
打开后根据不同 iOS 版本表现可能不同,但最终都是到 设置->通用->VPN与设备管理 处安装证书,首先要输入手机锁屏密码,然后输入 pkcs12 证书密码,上例的密码即 root
使用 Safari 打开网站即可,第一次打开浏览器会提示需要证书验证是否继续。
iOS 上有且仅有Safari浏览器支持 HTTPS 双向认证