Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

linux下curl不支持https解决方法 #19

Open
coneo opened this issue May 30, 2015 · 0 comments
Open

linux下curl不支持https解决方法 #19

coneo opened this issue May 30, 2015 · 0 comments
Labels

Comments

@coneo
Copy link
Owner

coneo commented May 30, 2015

案例
一个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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant