php curl常见错误:SSL错误、bool(false)

PHP 使用curl向一个https的url做请求,打印结果 ,总是为 false

解决办法:

很明显,验证证书的时候出现了问题。

使用curl如果想发起的https请求正常的话有2种做法:

方法一、设定为不验证证书和host。

在执行curl_exec()之前。设置option

$ch = curl_init();

######################################################
#我的代码是加上了下面两句,作用是不验证证书和host
#
#    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
#    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
#
#####################################################
#我的代码如下:
    $url = 'https://192.168.74.47/index.php/Home/index/denyin.html';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);


    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

    $res = curl_exec($ch);
    $rescode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch) ;
    var_dump($res);
#结果如下:
    string '{"username":"wuhui","password":"123456"}' (length=40)


方法二、设定一个正确的证书。

本地ssl判别证书太旧,导致链接报错ssl证书不正确。

我们需要下载新的ssl 本地判别文件

http://curl.haxx.se/ca/cacert.pem

放到 程序文件目录

curl 增加下面的配置

   curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,true); ;
   curl_setopt($ch,CURLOPT_CAINFO,dirname(__FILE__).'/cacert.pem');

大功告成
症状:php curl调用https出错 
排查方法:在命令行中使用curl调用试试。 
原因:服务器所在机房无法验证SSL证书。 
解决办法:跳过SSL证书检查。 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

症状:php curl调用curl_exec返回bool(false),命令行curl调用正常。 
排查方法: 
var_dump(curl_error($ch)); 
返回: 
string(23) "Empty reply from server" 
再排查: 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); 
返回: 
HTTP/1.1 100 Continue 
Connection: close 
原因:php curl接收到HTTP 100就结束了,应该继续接收HTTP 200 
解决方案: 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); 

PHP and cURL: Disabling 100-continue header 
Published June 15th, 2006 
I've been using cURL (through PHP) to build a sort of proxy for a project I'm working on. I 
need to parse the returned headers (to recover the HTTP status), so had included a very 
simple script to do so. It had worked fine in the past, but for some reason barfed in this case. 
A closer look at what was being returned revealed that for some reason, Apache was 
prepending the ‘normal' headers with an extra response header: 

HTTP/1.1 100 Continue 

HTTP/1.1 200 OK Date: Fri, 09 Jun 2006 15:23:42 GMT 
Server: Apache 
...A bit of Googling revealed that this was to do with a header that cURL sends by default: 

Expect: 100-continue 

…which in turns tells Apache to send the extra header. I poked around a fair bit but couldn't 
quite find a workable solution short of manually removing the header in PHP, which seemed 
a bit clumsy. Finally, on a hunch I tried this: 

curl_setopt( $curl_handle, CURLOPT_HTTPHEADER, array( 'Expect:' ) ); 

…which basically overrides the original ‘Expect:' header with an empty one. 

Hope this helps someone.

php的curl获取https加密协议请求返回json数据进行信息获取

<?php
header("Content-type:text/html; charset=utf-8");
function getToken($url){
        $ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //相当关键,这句话是让curl_exec($ch)返回的结果可以进行赋值给其他的变量进行,json的数据操作,如果没有这句话,则curl返回的数据不可以进行人为的去操作(如json_decode等格式操作)
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 
return curl_exec($ch); 
//$row=curl_getinfo($ch, CURLINFO_HTTP_CODE);


}
$row=getToken("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wxXXXXX&secret=1fd56a90sadfasdfxxfsdfsf");
$obj=json_decode($row);
echo $obj->access_token;

curl伪造IP和来源

本文实例讲述了php使用CURL伪造IP和来源的方法。分享给大家供大家参考。具体分析如下:
伪造IP来源对于php来说是很简单的一件事情,我们只要利用了php的curl即可实现伪造IP来源的功能,IP地址你可以随便写.
index.php实例代码如下:
 代码如下:
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "http://localhost/curl.php"); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR:8.8.8.8', 'CLIENT-IP:8.8.8.8'));//IP 
curl_setopt($ch, CURLOPT_REFERER, "http://www.jb51.net/ ");   //来路 
curl_setopt($ch, CURLOPT_HEADER, 1); 
$out = curl_exec($ch); 
curl_close($ch);

curl.php代码如下:
 代码如下:
function getClientIp() { 
    if (!emptyempty($_SERVER["HTTP_CLIENT_IP"])) 
        $ip = $_SERVER["HTTP_CLIENT_IP"]; 
    else if (!emptyempty($_SERVER["HTTP_X_FORWARDED_FOR"])) 
        $ip = $_SERVER["HTTP_X_FORWARDED_FOR"]; 
    else if (!emptyempty($_SERVER["REMOTE_ADDR"])) 
        $ip = $_SERVER["REMOTE_ADDR"]; 
    else 
        $ip = "err"; 
    return $ip; 
} 
echo "IP: " . getClientIp() . ""; 
echo "referer: " . $_SERVER["HTTP_REFERER"];

用index.php 请求 curl.php,输出结果:
IP:8.8.8.8  referer:http://www.jb51.net
伪造成功,这是不是给采集的朋友提供了很好的换IP的方案,当然防被刷的朋友也要注意了.
补充:
PHP中的CURL函数库(Client URL Library Function)如下:
curl_close — 关闭一个curl会话
curl_copy_handle — 拷贝一个curl连接资源的所有内容和参数
curl_errno — 返回一个包含当前会话错误信息的数字编号
curl_error — 返回一个包含当前会话错误信息的字符串
curl_exec — 执行一个curl会话
curl_getinfo — 获取一个curl连接资源句柄的信息
curl_init — 初始化一个curl会话
curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄资源
curl_multi_close — 关闭一个批处理句柄资源
curl_multi_exec — 解析一个curl批处理句柄
curl_multi_getcontent — 返回获取的输出的文本流
curl_multi_info_read — 获取当前解析的curl的相关传输信息
curl_multi_init — 初始化一个curl批处理句柄资源
curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源
curl_multi_selectGet all the sockets associated with the cURL extension, which can then be "selected"
curl_setopt_array — 以数组的形式为一个curl设置会话参数
curl_setopt — 为一个curl设置会话参数
curl_version — 获取curl相关的版本信息
curl_init()函数的作用初始化一个curl会话,curl_init()函数唯一的一个参数是可选的,表示一个url地址.
curl_exec()函数的作用是执行一个curl会话,唯一的参数是curl_init()函数返回的句柄.
curl_close()函数的作用是关闭一个curl会话,唯一的参数是curl_init()函数返回的句柄.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值