C/C++使用CURL对CloudFlare站点做主机及对等端验证相关问题
根因说明
你此前下载的origin_ca_rsa_root.pem、origin_ca_ecc_root.pem等证书属于Cloudflare Origin CA根证书,仅用于Cloudflare边缘节点验证你的源站服务证书,完全不适用于客户端侧校验Cloudflare边缘节点返回的公网证书,这是你校验失败的核心原因。
可行解决方案
按你的使用场景可选以下方案:
- 通用场景(需访问任意Cloudflare站点)
Cloudflare边缘节点的公网证书均由全球公共信任CA签发,直接让CURL使用系统内置的CA根证书包即可完成校验,无需单独指定Cloudflare相关证书。如果Windows环境下CURL未默认加载系统CA,可使用curl官方维护的公共CA根证书包,即可覆盖所有Cloudflare站点的校验需求。 - 限定信任场景(仅信任Cloudflare相关CA)
如果你需要缩小信任范围、仅允许访问Cloudflare托管的站点,可以收集Cloudflare公开用于签发边缘节点证书的所有根CA、中间CA,合并为单个PEM文件传入CURLOPT_CAINFO_BLOB参数即可。目前Cloudflare用于签发边缘公网证书的CA包含Digicert、GlobalSign、Let's Encrypt等机构的多个根证书,你可以从Cloudflare官方公开的说明中导出对应证书合并使用。 - 固定站点场景(仅访问少量指定Cloudflare站点)
如果你只需要访问特定几个Cloudflare站点,更安全的方案是使用公钥钉选:提取目标站点证书的公钥哈希,通过CURL的CURLOPT_PINNEDPUBLICKEY参数配置即可,不需要校验完整证书链,也不会受证书更新、CA轮转的影响。
调试验证方法
使用以下openssl命令可以验证你准备的CA文件是否可用:
# 替换your.domain为实际访问的域名,your_ca.pem为你的CA文件路径 openssl s_client -connect your.domain:443 -CAfile your_ca.pem
返回结果中出现Verify return code: 0 (ok)即代表校验正常。
此前单站点证书不通用的原因
你从单个站点提取的是站点的叶子证书或对应专属中间CA,仅对该站点或该中间CA签发的小范围站点有效,无法覆盖Cloudflare所有站点使用的不同CA签发的证书。
内容的提问来源于stack exchange,提问作者Mecanik
相关产品推荐
相关产品推荐

