reCaptcha file_get_contents():SSL操作失败

时间:2015-11-21 23:31:03

标签: php ssl file-get-contents recaptcha

我在网页上使用Google reCaptcha。

在测试模式下一切正常。没有SSL。

当我在生产环境中测试我的网页时,会发生以下错误:

  

警告:file_get_contents():SSL操作失败并带有代码   1. OpenSSL错误消息:错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败    /vendor/google/recaptcha/src/ReCaptcha/RequestMethod/Post.php 的   在线 68

警告:file_get_contents():   无法启用加密    /vendor/google/recaptcha/src/ReCaptcha/RequestMethod/Post.php 的   在线 68

警告:   的file_get_contents(https://www.google.com/recaptcha/api/siteverify):   无法打开流:操作失败    /vendor/google/recaptcha/src/ReCaptcha/RequestMethod/Post.php 的   在线 68
[" invalid-json"]

我这样调用reCaptcha API:

<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit"
                async defer></script>

如google的开发者页面所述。

我在hoststar.ch上托管我的网页。有TSL 1.2正在运行。

我希望有人可以帮助我。

2 个答案:

答案 0 :(得分:4)

在回复您的上一条评论时,我发现您无法更改Google reCaptcha api - 我的意思只是在file_get_contents上实际执行example.com(确实存在)作为一个测试,看看你是否可以使用该方法检索任何内容,因为一些webhosts禁用相关的功能。

但是,对于Google reCatcha API,您可能需要为file_get_contents函数调用指定其他参数,特别是为SSL专门设置context选项。

$secret = 'Your google secret';
$captcha = trim( $_POST['g-recaptcha-response'] );
$ip = $_SERVER['REMOTE_ADDR'];
$url = "https://www.google.com/recaptcha/api/siteverify?secret={$secret}&response={$captcha}&remoteip={$ip}";

$options=array(
    'ssl'=>array(
        'cafile'            => '/path/to/cacert.pem',
        'verify_peer'       => true,
        'verify_peer_name'  => true,
    ),
);
$context = stream_context_create( $options );
$res=json_decode( file_get_contents( $url, FILE_TEXT, $context ) );
if( $res->success ){/* all good */}
else{ /* captcha failed */ }

如果您还没有cacert.pemca-bundle.crt的副本,可以从各自的链接下载。{p> cafile的路径可以使用 - 将副本保存到主机并更正路径以适合您的环境。

答案 1 :(得分:0)

file_get_contents 更改为 curl 。这是代码,

更改 -

$verify=file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret={$secret}&response={$response}");
 $captcha_success=json_decode($verify);  /*store json response*/

到此代码:

$ch = curl_init("https://www.google.com/recaptcha/api/siteverify?secret={$secret}&response={$response}");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$verify = curl_exec($ch);

$captcha_success=json_decode($verify);  /*store json response*/

请注意 $ secret 是存储在服务器端的密钥,而 $ response 是从前端通过帖子发送的重新接收回复。