cURL与https页面的连接

时间:2014-06-30 22:53:22

标签: php curl ssl https

所以我有这段代码:

$url = "https://..."; //a valid url, showing without errors a correct XML

$handle = curl_init($url);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($handle, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($handle, CURLOPT_URL, $url);
curl_setopt($handle, CURLOPT_TIMEOUT, 60);

/* to which i added the following */
curl_setopt($handle, CURLOPT_CAPATH, "http://curl.haxx.se/ca/cacert.pem");
curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, TRUE);

$result = curl_exec($handle);
$resultXml = new SimpleXMLElement($result); //Line 47

/* tests */
var_dump($handle); echo "<br/><br/>"; //resource(11) of type (curl) 
var_dump($url);    echo "<br/><br/>"; //string(149) "https://..." (exactly $url)
var_dump($result); echo "<br/><br/>"; //bool(false)

这会产生此错误:

Fatal error:  Uncaught exception 'Exception' with message 'String could not be parsed as XML' [...] on line 47
Stack trace:
#0 C:\yy.php(47): SimpleXMLElement->__construct('')
#1 C:\xx.php(23): Integrator->Integrator('numbers', Object(Database))
#2 {main}
thrown [...] on line 47

var_dump()返回的是注释。

使用它,我们可以看到$ result为空;这是主要问题!

我首先想到的问题是从https连接到页面,所以我在中间添加了3行;问题依然存在。

现在我想知道我的SSL证书(来自Gandi SAS)是否明确包含在http://curl.haxx.se/ca/cacert.pem中的事实是问题所在。 如果是这样,我如何告诉CURLOPT_CAPATH获取我的证书?

其他地方有错误吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

使用CURLOPT_CAINFO指定证书文件。

CURLOPT_CAINFO - The name of a file holding one or more certificates to
verify the peer with. This only makes sense when used in combination with
CURLOPT_SSL_VERIFYPEER.

这需要是文件的绝对路径。

修复ssl问题后,您应该在卷曲响应中获取数据。