卷曲导致SSL:无法获取本地颁发者证书


Curl causes SSL: unable to get local issuer certificate

按照以下回答步骤在Mac OS Yosemite上安装Homebrew PHP 5.5后,我发现我可以连接到外部SSL主机,这之前曾提示我"错误编号:56错误字符串:SSLRead()返回错误-9806"。此问题已解决。

但现在,在我的日常工作中,我遇到了另一个主机的SSL问题:Canvas API。

在终端上运行以下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。现在,一个不工作的人在工作,但另一个正在工作的人却没有。(抛出无法获取本地颁发者证书面消息)。任何智慧都会受到赞赏。

编辑php -i:的卷曲输出

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

这看起来是自制程序的卷曲公式中的一个错误,我刚刚提交了一个修复程序。https://canvas.instructure.com/有GoDaddy颁发的证书,而这些证书似乎不适用于使用酿造openssl的酿造curl。如果/当自制软件的维护人员接受我的补丁时,你就可以简单地通过获得这个修复

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

在这种情况发生之前,你可以直接从我的pull请求中安装修复程序,如下所示:

$ 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

更新:

自制软件维护人员合并了我的补丁,所以现在正式在自制软件中进行修复。所以只需运行我上面描述的前3个命令。不再需要从拉取请求进行安装。

在我的案例中,证书本身存在问题。

我没有像这样创建捆绑包

#cat public.crt intermediate.crt >> bundle.crt

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

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

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

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