这是我的开发机器上的脚本:
.crt
没问题。将其移动到生产环境后,cURL连接将失败,并显示以下错误:
SSL证书问题:无法获得本地颁发者证书
PHP 5.6.23
内容,因此我知道证书的路径不是问题。Apache 2.4
Win 7 x64
Linux CentOS 7
,生产机器是CURLOPT_VERBOSE
我不知道从哪里开始寻找原因。为什么脚本不能在生产中工作?
更新 感谢@ blackpen在评论中的重要提示,我了解了用于生成连接日志的{{1}}选项。这是破碎的生产环境中的输出:
- 在DNS缓存中找不到主机名
- 尝试104.20.47.245 ......
- 连接到uat.dwolla.com(104.20.47.245)端口443(#0)
- 成功设置证书验证位置:
- CAfile:/path/to/GoDaddyRootCertificateAuthority-G2.crt CApath:none
- SSL证书问题:无法获取本地颁发者证书
- 关闭连接0
以下是来自同一脚本的日志,但来自工作开发环境:
- DNS缓存中的主机名已过时,已删除
- 尝试104.20.48.245 ......
- 连接到uat.dwolla.com(104.20.48.245)端口443(#0)
- 密码选择:ALL:!导出:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
- 成功设置证书验证位置:
- CAfile:/path/to/GoDaddyRootCertificateAuthority-G2.crt
CApath:无- NPN,协商HTTP1.1
- 使用TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256进行SSL连接
- 服务器证书:
- ...(证书详情)
- SSL证书验证确定。
- ...(更多POST详情)
答案 0 :(得分:2)
通过使用名为.crt
taken from here
cacert.pem
,我能够让脚本在两种环境中都能运行
我仍然不知道到底发生了什么,但我怀疑它可能与证书的格式有关。也许Windows上的PHP可以处理.crt
,但Linux上的PHP无法处理。我从评分最高的答案on another question.