linux下curl不支持https解决方法

@coneo 2015-05-30 09:20:41发表于 coneo/blog linux

案例
一个php的测试用例test_curl.php:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,  "https://github.com");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何证书  
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSLVERSION, 1);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$ret = curl_exec($ch) ;
if ($ret == false)
{
    var_dump(curl_errno($ch));         //输出错误信息,很重要
    var_dump(curl_error($ch));
}
var_dump($ret);
curl_close($ch);

假设现在可以访问该php脚本,浏览器中输入 you_url/test_curl.php。然后会有输出:

int(1) string(51) "Protocol https not supported or disabled in libcurl"

在linux上,你也可以直接通过curl命令来测试。

curl -k https://github.com

解决
根据提示了解到该libcur是不支持https协议的。我们的脚本是放在linux下,通过命令:
curl -V 可以查看支持的协议类型,发现的确不支持https协议。解决方法是重新安装libcurl以支持https。
支持https实际上就是支持ssl加密。

这里需要用到的包主要有两个:libcurl和php源码包。

安装libcurl
下载源码包并解压,进入目录,开始配置。

./configure -prefix=/usr/local/curl/ -with-ssl=/usr/lib64 -with-libidn
with-ssl就是关键,网上说这里的with-ssl应该指向ssl的库目录,我系统中的ssl安装目录为/usr/local/ssl ,但是设置下来,在编译的时候会提示:
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/4.3.2/../../../../lib/libssl.a(s2_clnt.o): relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC
/usr/lib/gcc/x86_64-linux-gnu/4.3.2/../../../../lib/libssl.a: could not read symbols: Bad value
collect2: ld returned 1 exit status

根据这段提示可以看到我们是对libssl进行静态链接,实际上我们应该要进行动态链接,包括php链接curl以及apache链接php都是动态链接的方式。因此,我们真正需要链接libssl.so,在/usr/lib64下。
(ps:网上根据提示,修改了configure参数来进行静态链接--disable-file --without-pic --disable-shared,这样编译能通过,但是后面php在链接curl的时候依然会有类似的提示)

在configure之后,最后他会列出一些feature的支持情况,例如: ssl : enable (openssl)。
另外,在configure curl的时候,有几个库是需要安装的,不然configure会出错:

curl-devel
e2fsprogs-devel
krb5-devel
libidn-devel
openssl-devel

由于我的机器无法进行在线安装,我恨透了rpm的各种包管理,他的包检查非常严格,依赖的rpm包版本号很严格。

configure之后就是make 和make install了。
安装好之后可以测试一下是否支持https:/usr/local/curl/bin/curl -V

安装php
下载源码包解压,进入目录,开始配置。

./configure -prefix=/usr/local/php5 -with-apxs2=/usr/local/apache/bin/apxs -with-curl=/usr/local/curl -with-libxml-dir=/usr/local/libxml2

然后编译安装:

make && make install

重启apache即可

service httpd restart

索引:
http://help.directadmin.com/item.php?id=314
http://www.111cn.net/sys/linux/52561.htm
http://www.linuxidc.com/Linux/2012-02/55234.htm
http://curl.haxx.se/libcurl/php/install.html
https://bbs.et8.net/bbs/showthread.php?p=10143459