PHP cURL在HTTPS上返回FALSE

时间:2013-07-05 14:13:53

标签: php post curl

我正在尝试制作一个机器人:https://coinroll.it/api

来自网站:
Coinroll API是一个无状态接口,可通过HTTPS工作。使用POST变量(application / x-www-form-urlencoded)进行请求,而响应以JSON(application / json)编码。访问API需要HTTPS连接。

我有以下代码:

$ch = curl_init();
$data = array('user' => 'xxx', 'password' => 'yyy');
curl_setopt($ch, CURLOPT_URL, 'https://coinroll.it');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));   
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$result = curl_exec($ch);
echo $result;

当我运行此代码时,它返回一个空白页面,我做错了什么?

修改
我实际上不需要使用cURl,如果有更好的解决方案,请告诉我。

3 个答案:

答案 0 :(得分:2)

您可以使用CURLOPT_VERIFYPEER阻止cURL尝试验证SSL证书。

还在URL中设置操作:

$ch = curl_init();
$data = array('user' => 'xxx', 'password' => 'yyy');
curl_setopt($ch, CURLOPT_URL, 'https://coinroll.it/getbalance');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($ch);
echo $result;

答案 1 :(得分:2)

您可以使用以下cURL选项来查看HTTP连接会发生什么:

curl_setopt($ch, CURLOPT_VERBOSE, true);

当为TRUE时,它输出详细信息。

答案 2 :(得分:0)

今天我遇到了“到目前为止一直工作正常”的情况,但是当 FQDN 更改时它停止工作,我不得不使用不同的 DN 对另一个证书进行自签名。

经过几次实验,结果是 Subject Alternate Name(又名 SAN)与证书名称不匹配,并且 curl 调用未设置为 CURLOPT_SSL_VERIFYHOST, 2

结论:默认情况下,CURLOPT_SSL_VERIFYHOST 设置为 2,但是,如果您的证书 SAN 错误,它将失败,除非您停用 CURLOPT_SSL_VERIFYHOST,并使用它停用 CURLOPT_SSL_VERIFYPEER。

显然最好的做法是同时设置两者,并有一个与主题匹配的 SAN。

提醒:这是在命令行上使用 OpenSSH 快速检查 SAN 的方法:

<块引用>

openssl x509 -in /etc/ssl/certs/recette.pharmags.fr.crt -noout -text | grep -A1 "Subject Alternative Name"