【发布时间】:2017-01-03 14:44:14
【问题描述】:
以下脚本适用于PHP 5.6.23:
$options = [
CURLOPT_POST => 1,
CURLOPT_URL => 'https://uat.dwolla.com/oauth/rest/offsitegateway/checkouts',
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_POSTFIELDS => json_encode(['name'=>'value']),
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_CAINFO => '/path/to/certs/GoDaddyRootCertificateAuthority-G2.crt',
];
$ch = curl_init();
curl_setopt_array($ch, $options);
if( ! $result = curl_exec($ch)) $err = curl_error($ch);
else $err = null;
curl_close($ch);
if($err) echo $err;
else print_r(json_decode($result,true));
我从 Dwolla 的支付 API 获得了预期的响应。为了使我的脚本更加动态,我尝试将其更改为引用托管我希望 cURL 信任的证书的目录。所以我把最后一个选项(CURLOPT_CAINFO)改成了:
CURLOPT_CAPATH => '/path/to/certs'
然而,这会破坏脚本并且没有建立连接;错误是:
SSL 证书问题:无法获取本地颁发者证书
我知道目录是正确的并且证书文件是有效的,因为原始脚本引用了同一目录中的证书。我希望cURL 扫描目录中的文件并找到它需要的证书,但这并没有发生。这是为什么呢?
【问题讨论】:
-
将
crt重命名为test.crt并重试。 -
@Hackerman 没有区别;它以第一种方式工作(使用
CURLOPT_CAINFO)。第二种方式同样的错误(CURLOPT_CAPATH)。 -
@Hackerman 我认为如果证书是问题所在,那么 OP 中的原始脚本将不起作用(因为它会根据我已经使用的证书验证远程服务器)。我仍然尝试了您发送的证书,结果是一样的。原创剧本作品;修改后的脚本产生相同的错误
-
刚刚尝试(使用 php.ini 配置)使用
curl.capath(以及openssl.capath) - 两者都没有效果。但是使用openssl.cainfo它可以工作。我不确定为什么capath不起作用。