如何验证开启SSL校验的cURL请求传输数据是否加密
问题背景
- 持有
example.com与domain.com两个网站,二者DNS均托管在Cloudflare平台,已开启Cloudflare免费SSL/TLS加密服务,两个站点均配置为Full加密模式并强制开启HTTPS重写 example.com托管在WebHostingA服务商,domain.com托管在HosterB服务商- 业务需求为通过
domain.com站点获取example.com/test.php的接口内容
现有实现代码
domain.com/get-contents.php 代码
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://example.com/test.php'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, TRUE); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_POSTFIELDS, ['username' => 'Bob']); $response = curl_exec($ch); var_dump($response);
example.com/test.php 代码
if (isset($_POST['username']) && ctype_alpha($_POST['username'])) { echo($_POST['username'] . " You got my contents!"); } else { echo("Nope!"); }
问题描述
当前代码运行正常,可以成功获取example.com/test.php的返回结果Bob You got my contents!。但代码中未手动为cURL配置任何证书,需要确认:
- 如何验证从
domain.com发出的请求、example.com返回的响应全程为加密传输 - 如何最终实现两个网站之间的安全数据传输
解答
你不用手动给cURL配置证书,不管是Linux还是Windows服务器环境,系统本身都会内置全球信任的根CA证书库。你代码里已经开启了CURLOPT_SSL_VERIFYPEER = TRUE和CURLOPT_SSL_VERIFYHOST = TRUE两个核心校验开关,只要cURL请求没有抛出证书相关错误,就说明TLS握手阶段已经完成合法证书校验,传输链路本身已经是加密状态。
可以通过以下方法实打实验证传输加密状态:
- 登录
domain.com所在的HosterB服务器,命令行执行curl -v -X POST -d "username=Bob" https://example.com/test.php查看调试日志。只要日志里出现SSL certificate verify ok记录,以及类似SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384的TLS连接信息,就证明证书校验通过、链路使用的是合规加密。 - 在两台服务器上分别抓包验证:用tcpdump抓取对应网卡的443端口流量,抓出的数据包如果全是乱码,无法直接识别POST的
username=Bob字段或者接口返回的明文内容,就说明传输内容是加密的;如果能直接读到明文,才代表加密失效。 - 查看Cloudflare后台的访问分析日志,两个站点的访问记录会标注请求使用的协议,只要标记为HTTPS、TLS版本为1.2及以上,也能佐证链路加密状态正常。
如果要把两个站点之间的传输安全做扎实,补几个配置即可:
- 在Cloudflare后台将两个站点的最低TLS版本调整为1.2,禁用TLS1.0、TLS1.1等老旧版本,同时关闭弱加密套件,避免TLS降级攻击。
- 不要关闭cURL的两个证书校验选项,很多人遇到证书报错就直接把两个参数设为
FALSE,这等于完全跳过证书校验,根本防不住中间人攻击。 - 建议把Cloudflare的SSL加密模式从Full调整为Full (Strict)。Full模式下Cloudflare回源时仅要求源站443端口存在证书,不会校验证书是否合法有效;Full (Strict)模式会严格校验源站证书的有效性,补上Cloudflare到源站这段链路的安全短板。
- 如果需要更高安全等级,可以在
example.com源站加一层访问控制,仅放行Cloudflare官方IP段访问test.php接口,同时给接口加上自定义请求头签名校验,就算接口地址泄露,第三方也无法伪造合法请求。
内容的提问来源于stack exchange,提问作者Kiwa
相关产品推荐
相关产品推荐

