这是在我的开发机器上运行的脚本:
$certPath = SITE_ROOT.'/certs/GoDaddyRootCertificateAuthority-G2.crt';
$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 => $certPath,
];
$ch = curl_init();
curl_setopt_array($ch, $options);
if( ! $result = curl_exec($ch)) $err = curl_error($ch);
curl_close($ch);
if(!$result) echo $err;
else print_r(json_decode($result,true));
echo '<br/><br/>';
readfile($certPath); //output cert on screen
echo '<br/><br/>';
没有问题。将其移至生产环境后,cURL 连接失败并出现以下错误:
SSL证书问题:无法获取本地颁发者证书
- 相同
.crt
内容被打印,所以我知道证书的路径不是问题。
- 两种环境都使用
PHP 5.6.23
on Apache 2.4
- 开发机是
Win 7 x64
,产品机器是Linux CentOS 7
我不知道从哪里开始寻找原因。为什么脚本在生产环境中不起作用?
UPDATE:感谢 @blackpen 在评论中的精彩提示,我了解了CURLOPT_VERBOSE
用于生成连接日志的选项。这是损坏的生产环境中的输出:
- 在 DNS 缓存中未找到主机名
- 正在尝试 104.20.47.245...
- 连接到 uat.dwolla.com (104.20.47.245) 端口 443 (#0)
- 成功设置证书验证位置:
- CAfile:/path/to/GoDaddyRootCertificateAuthority-G2.crt CApath:无
- SSL证书问题:无法获取本地颁发者证书
- 关闭连接0
以下是来自同一脚本但来自工作开发环境的日志:
- DNS 缓存中的主机名已过时、已损坏
- 正在尝试 104.20.48.245...
- 连接到 uat.dwolla.com (104.20.48.245) 端口 443 (#0)
- 密码选择: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
- 成功设置证书验证位置:
- CAfile: /path/to/GoDaddyRootCertificateAuthority-G2.crt
CA路径:无
- NPN,协商HTTP1.1
- 使用 TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256 的 SSL 连接
- 服务器证书:
- ...(证书详细信息)
- SSL 证书验证正常。
- ...(更多帖子详细信息)
通过替换,我能够使脚本在两种环境中工作.crt
仅适用于开发环境,文件名为cacert.pem
取自这里 https://curl.haxx.se/ca/cacert.pem
我仍然不知道到底发生了什么,但我怀疑这可能与证书的格式有关。也许 Windows 上的 PHP 可以处理.crt
,但 Linux 上的 PHP 不能。我从评分最高的答案中得到了这个想法关于另一个问题。 https://stackoverflow.com/questions/17478283/paypal-access-ssl-certificate-unable-to-get-local-issuer-certificate
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)