首先配置 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
双向认证