我正在开发一个使用 PHP-cURL 与 Twitter API 交互的项目,以构建我的 RESTful 请求。类似于(相信我,所有变量都已分配,等等):
$headers = array(
"POST /oauth2/token HTTP/1.1",
"Host: api.twitter.com",
"User-Agent: Twitter Application-only OAuth App v.1",
"Authorization: Basic ".$base64_encoded_bearer_token."",
"Content-Type: application/x-www-form-urlencoded;charset=UTF-8",
"Content-Length: 29"
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "grant_type=client_credentials");
$header = curl_setopt($ch, CURLOPT_HEADER, 1);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$retrievedhtml = curl_exec($ch);
echo curl_error($ch); //Throws Error
curl_close($ch);
我知道代码很好,因为我已将其上传到我的一个 Pagodabox 应用,并且运行正常。但是,当我使用 Webmatrix 在本地测试时,cURL 会抛出错误SSL certificate problem: unable to get local issuer certificate
。所以我知道这是我的问题。
如果我知道我正在将文件上传到 Pagodabox,情况就不会那么糟糕,但此应用程序所在的生产服务器正在运行 Windows 服务器(这就是我在本地测试中运行 Webmatrix 的原因),而且我的初步测试也遇到了同样的问题。
更新:对于遇到同样问题的人,我发现阅读这些项目的代码很有帮助:
答案1
CURL 将在名为 的文件中查找受信任的 SSL 证书curl-ca-bundle.crt
,在 Windows 上位于以下路径:
- 你的程序所在的目录
- 当前工作目录
%windir%\system32
%windir%
- 目录中
%PATH%
如果没有找到这个,或者找到的第一个不包含您的证书的颁发者证书(您必须信任您自己的证书),则会抛出此错误。
解决此问题的一种可能方法是将证书链的其余部分包含在您出示的证书中(对于 PEM 证书,只需连接证书、签署您的证书的证书以及签署该证书的证书,直到获得根证书,这通常意味着文件包含 3 个证书)。