You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP集成Google ReCaptcha出现file_get_contents SSL验证失败错误

解决Google reCAPTCHA SSL证书验证失败的问题

这个错误我之前碰到过好几次,尤其是在Windows IIS环境下(看你的路径是E:\inetpub,应该是IIS),核心原因就是PHP的file_get_contents在请求Google的reCAPTCHA API时,没办法验证服务器的SSL证书,大概率是服务器上的CA根证书 bundle 过期或者PHP没正确配置指向它。

下面给你几个靠谱的解决方案,按优先级排序:

1. 配置PHP的CA根证书(推荐生产环境)

这是最安全、最彻底的解决方法:

  • 先下载最新的CA根证书包,把它保存成cacert.pem文件,放到服务器上的安全目录,比如E:\inetpub\wwwroot\cert\cacert.pem
  • 打开你的php.ini配置文件,找到openssl.cafile这一行,去掉前面的注释符号;,然后设置成刚才的证书路径:
    openssl.cafile = "E:\inetpub\wwwroot\cert\cacert.pem"
    
  • 重启IIS或者PHP服务,让配置生效

2. 用cURL替换file_get_contents请求(灵活安全)

Google的reCAPTCHA库支持自定义请求方法,我们可以写一个基于cURL的请求类,避开file_get_contents的SSL问题:

<?php
use ReCaptcha\ReCaptcha;
use ReCaptcha\RequestMethod;
use ReCaptcha\RequestParameters;

class CurlPost implements RequestMethod
{
    public function submit(RequestParameters $params)
    {
        $ch = curl_init($params->getUrl());
        // 设置POST请求参数
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $params->toQueryString());
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        // 启用SSL验证,并指定CA证书路径
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
        curl_setopt($ch, CURLOPT_CAINFO, "E:\inetpub\wwwroot\cert\cacert.pem");

        $response = curl_exec($ch);
        curl_close($ch);

        return $response;
    }
}

// 使用自定义请求方法初始化reCAPTCHA
$recaptcha = new ReCaptcha('你的reCAPTCHA密钥', new CurlPost());
$resp = $recaptcha->verify('用户提交的token', $_SERVER['REMOTE_ADDR']);

这样既保持了SSL验证的安全性,又绕开了file_get_contents的配置问题。

3. 临时禁用SSL验证(仅测试用,绝对不要生产环境)

如果只是临时测试,不想折腾配置,可以修改Google库的Post.php文件(路径是E:\inetpub\wwwroot\vendor\google\recaptcha\src\ReCaptcha\RequestMethod\Post.php)里的上下文配置:
找到创建$context的代码块,修改成:

$context = stream_context_create(array(
    'http' => array(
        'method' => 'POST',
        'header' => 'Content-type: application/x-www-form-urlencoded',
        'content' => $params->toQueryString(),
        'timeout' => 10
    ),
    'ssl' => array(
        'verify_peer' => false,
        'verify_peer_name' => false
    )
));

⚠️ 注意:这个方法会关闭SSL证书验证,你的请求可能被中间人攻击,生产环境绝对不能用!

额外排查点

别忘了检查服务器的系统时间,如果时间和实际时间偏差太大(比如超过几个小时),也会导致SSL证书验证失败,调整到正确时间就能解决问题。

内容的提问来源于stack exchange,提问作者KellyM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:08:03