Curl引起SSL问题:无法获取本地颁发者证书。

8
在 Mac OS Yosemite 上安装 Homebrew PHP 5.5,按照这个回答的步骤steps后,我发现我可以连接到外部 SSL 主机,并且不再出现“错误编号: 56 错误字符串: SSLRead() return error -9806”的提示。 这个问题已经被解决了。
但是,现在,在我的日常工作中,我在另一个主机 Canvas API 上遇到了另一个 SSL 问题。
在终端上运行以下 Curl 命令(使用 OSX 自带的 curl)。
curl -v -H "Accept: application/json" -H "Content-type: application/json" -X GET \
  -d '{"userid": "mohit", "password":"password"}' https://canvas.instructure.com/api/v1/accounts

正常情况下可以工作,但是通过PHP时我遇到了SSL证书问题:无法获取本地颁发者证书。

所以我用PHP Curling时使用OpenSSL修复了我的原始问题,但是我又遇到了这个新问题。

我尝试将PEM文件添加到我的php.ini中, curl.cainfo = "/usr/local/cacert.pem" 但是这触发了另一个错误。

error setting certificate verify locations: CAfile: /usr/local/cacert.pem CApath: none.

我有点困惑。我需要让Brew PHP Curl版本同时适用于两个API。现在,之前无法工作的那一个已经可以了,但是之前可以工作的另一个却不能工作了(抛出了"unable to get local issuer certificate"消息)。非常感谢您的帮助。
编辑:从php -i得到的Curl输出:
cURL support => enabled
cURL Information => 7.38.0
Age => 3
Features
AsynchDNS => No
CharConv => No
Debug => No
GSS-Negotiate => No
IDN => No
IPv6 => Yes
krb4 => No
Largefile => Yes
libz => Yes
NTLM => Yes
NTLMWB => Yes
SPNEGO => No
SSL => Yes
SSPI => No
TLS-SRP => Yes
Protocols => dict, file, ftp, ftps, gopher, http, https, imap, imaps, ldap, ldaps,
             pop3, pop3s, rtsp, smtp, smtps, telnet, tftp
Host => x86_64-apple-darwin14.0.0
SSL Version => OpenSSL/1.0.1j
ZLib Version => 1.2.5

你能添加 phpinfo() 输出中的 cURL 部分吗? - Alexander O'Mara
你编辑了哪个 php.ini 文件?若是 Apple 自带的 PHP,则应该在 /etc/php.ini 中。Homebrew 的 php.ini 则应该在 /usr/local/etc/php/5.5/php.ini 中。 - Asaph
@Asaph 我编辑了 homebrew 位置下的 php.ini 文件。我在 apache 中禁用了 apple 自带的 php,当我执行 php -i 命令时,我看到我正在使用 homebrew 版本。在你之前的帖子中,你没有告诉我在 php.ini 中添加或更改任何内容,所以我只添加了我的 xdebug 设置。我是否忘记在 php.ini 中启用某些设置? - Mattijs
@AlexanderO'Mara 请看我的编辑后的帖子。 - Mattijs
2个回答

11

这似乎是Homebrew的Curl公式中一个bug,我刚刚提交了一个修复方案https://canvas.instructure.com/有一个由GoDaddy颁发的证书,这些证书似乎无法使用Homebrew提供的curlopenssl。如果Homebrew的维护者接受我的补丁,您可以通过以下方式轻松获取此修复程序:

$ brew rm curl # remove your broken brewed curl
$ brew update
$ brew install --with-openssl curl

在此之前,您可以像这样直接从我的拉取请求中安装修复程序:

$ brew rm curl # remove your broken brewed curl
$ brew install --with-openssl https://raw.githubusercontent.com/asaph/homebrew/curl-openssl-godaddy-ca-bug/Library/Formula/curl.rb

更新:

Homebrew 的维护者合并了我的补丁,因此修复程序现在已正式包含在 Homebrew 中。所以只需运行我上面描述的前三个命令。不再需要从 pull request 安装。


2
伙计,你做到了。谢谢,现在它正在正常工作。干得好! - Mattijs
1
显然现在你需要执行 brew install curl-openssl - felipeek

0
在我的情况下,证书本身存在问题。
我没有像这样创建“bundle”:
#cat public.crt intermediate.crt >> bundle.crt

相反,我只使用了public.crt。

因此,如果您有中间证书,请尝试创建一个捆绑包。

请注意,捆绑包中证书的顺序很重要,public.crt必须放在第一位。

尝试在平行主题中检查我的答案


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接