相同的cURL脚本适用于dev。无法弄清楚为什么不在生产中

时间:2016-08-26 22:47:47

标签: php ssl curl

这是我的开发机器上的脚本:

.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详情)
  •   

1 个答案:

答案 0 :(得分:2)

通过使用名为.crt taken from here

的文件替换仅在开发环境中有效的cacert.pem,我能够让脚本在两种环境中都能运行

我仍然不知道到底发生了什么,但我怀疑它可能与证书的格式有关。也许Windows上的PHP可以处理.crt,但Linux上的PHP无法处理。我从评分最高的答案on another question.

中得到了这个想法