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
相关产品推荐
相关产品推荐

