curl存在SSL的bug,并在Linux下更新或安装curl

  • 发布时间:2016年12月9日 17:42
  • 作者:杨仕航

这是一个php使用curl向一个https链接post提交数据发现的问题。

本来这里最好放到php分类下面,但我php很少用,而且每次用一句查一句。所以放到内容和Linux有关联的Linux分类下。


问题如下:

由于是https链接,需要忽略证书。测试代码如下:

<?php
$json = '{
    "items":[
        {"product_id":"300767189","quantity":2,"vendor_id":"200256993"}
    ],
    "language":"en",
    "currency":"USD",
}';

$headers = array(
    "Content-type: application/json;charset='utf-8'",
);

$url = 'https://xxxxxxxxxxxxxxxxx'; //网址不重要,注意前面是https

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查  
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // 从证书中检查SSL加密算法是否存在  

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转 
curl_setopt($ch, CURLOPT_AUTOREFERER, 1); // 自动设置Referer  
curl_setopt($ch, CURLOPT_POST, 1);

curl_setopt($ch, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环  
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);

$result = curl_exec($ch);

curl_close($ch);
print_r($result);
echo 'end';
?>

但无法获取到任何结果,只得到最后一条语句的'end'。

于是尝试把curl错误信息输出。把下面代码加载curl_close前面:

if(curl_error($ch)) 
{ 
    print_r(curl_error($ch)); 
}

得到SSL connect error 错误信息。(这里可能你的错误描述不太一样,大致也是SSL问题的话,继续往下看)

这里我已经忽略了SSL证书检查,还是保存。继续谷歌(因为百度查到的东西都是重复的),最后查到这个东西:

20161209/20161209173723867.png

大致意思是说,这是curl的bug!bug!bug!

若curl版本是7.2x和7.3x都不行,至少要升级到7.4x才行。我们可以用curl_version()函数得到curl的版本信息。


这里需要注意,在php中说的curl是libcurl,而不是系统的curl,这两个是有区别。

我服务器的系统是Linux,CentOS发行版。尝试了CentOS下更新

yum update libcurl

但显示要升级的版本才7.29。折腾几天,发现一下两种方法。(若你急着用,直接看第2种方法)


1、更新系统的curl库

升级更新curl方法如下:

1)下载curl包

wget http://curl.haxx.se/download/curl-7.49.0.tar.gz

当然,这个链接我是在http://curl.haxx.se/download/找到的。

2)解压

tar -xzvf curl-7.49.0.tar.gz

3)覆盖安装

cd curl-7.49.0
./configure
make
make install

cd命令是进入到刚刚解压出来的文件夹。接着在linux中编译安装。若之前存在curl,则会被覆盖。

更新之后,php如何使用?这里有两个分支:

a、用php的shell_exec调用命令行执行curl

b、对php再一次用源码编译一次,重新编译会生成对应的curl.so


2、升级libcurl

该方法是发现新的可用yum源之后,补充的方法:

1)添加yum源

rpm -Uvh http://www.city-fan.org/ftp/contrib/yum-repo/city-fan.org-release-1-12.rhel6.noarch.rpm

2)安装或更新libcurl

yum install libcurl


上一篇:我的笔记本第二次改造:更换主板和外壳

下一篇:VSTO详细打包过程

评论列表

智慧如你,不想发表一下意见吗?

新的评论

清空