我正在使用XAMPP进行开发 . 最近我将xampp的安装从旧版本升级到1.7.3 .
现在当我卷曲启用HTTPS的网站时,我得到以下异常
致命错误:未捕获的异常'RequestCore_Exception',消息'cURL resource:Resource id#55; cURL错误:SSL证书问题,验证CA证书是否正常 . 详细信息:错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败(60)'
每个人都建议使用PHP代码中的一些特定curl选项来解决这个问题 . 我认为这不应该是这样的 . 因为我的旧版XAMPP没有任何问题,只是在安装新版本后才发生 .
我需要帮助来弄清楚我的PHP安装中哪些设置发生了变化,Apache等可以解决这个问题 .
11 回答
curl曾经包含一个已接受的CA列表,但不再捆绑任何CA证书 . 所以默认情况下它会拒绝所有SSL证书作为无法验证的 .
你'll have to get your CA'的证书和点卷曲 . 更多细节见cURLS的Details on Server SSL Certificates .
这是Windows中一个非常常见的问题 . 您只需将
cacert.pem
设置为curl.cainfo
即可 .从PHP 5.3.7开始,您可以:
下载https://curl.haxx.se/ca/cacert.pem并将其保存在某个地方 .
update
php.ini
- 添加curl.cainfo = "PATH_TO/cacert.pem"否则,您需要为每个cURL资源执行以下操作:
Warning: this can introduce security issues that SSL is designed to protect against.
但是一个非常简单的解决方案对我来说是:
在致电之前:
在php文件中 .
我相信这会禁用SSL证书的所有验证 .
Source: http://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html
以上所有信息转到:http://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html
上面的解决方案很棒,但是如果你使用的是WampServer,你可能会发现在
php.ini
中设置curl.cainfo
变量不起作用 .我最终发现WampServer有两个
php.ini
文件:第一个显然用于通过Web浏览器调用PHP文件,而第二个用于通过命令行或
shell_exec()
调用命令时 .TL;DR
如果使用WampServer,则必须将
curl.cainfo
行添加到 bothphp.ini
文件 .有时,如果您尝试联系的应用程序具有自签名证书,则http://curl.haxx.se/ca/cacert.pem中的正常cacert.pem无法解决问题 .
如果您确定服务 endpoints URL,请通过浏览器点击它,手动将证书保存在“带链(XEM)的X 509证书”格式中 . 将此证书文件指向
设置CURLOPT_CAINFO的curl选项时请记住使用单引号,使用双引号只会导致另一个错误 . 所以你的选择应该是这样的:
另外,在你的php.ini文件中,设置应该写成:(注意我的双引号)
我把它直接放在说明这一行的下面:
extension=php_curl.dll
(仅限于组织目的,你可以把它放在
php.ini
的任何地方,我只是把它放在另一个卷曲引用附近所以当我使用关键字curl搜索时,我可以在一个区域找到两个卷曲引用 . )为了所有圣洁的爱...
在我的例子中,我必须将
openssl.cafile
PHP配置变量设置为PEM文件路径 .我相信很多系统都在设置
curl.cainfo
在PHP 's config is exactly what is needed, but in the environment I'm中使用,这是eboraas/laravel docker容器,它使用Debian 8(jessie)和PHP 5.6,设置该变量不起作用 .我注意到
php -i
的输出没有提到有关该特定配置设置的任何内容,但它确实有几行关于openssl
. 有一个openssl.capath
和openssl.cafile
选项,但只是设置第二个允许curl通过PHP最终可以使用HTTPS URL .我在亚马逊AMI linux上有同样的错误 .
通过在 /etc/php.d/curl.ini 上设置 curl.cainfo 解决了问题
https://gist.github.com/reinaldomendes/97fb2ce8a606ec813c4b
Addition October 2018
在Amazon Linux v1上编辑此文件
添加此行
当我试图从www.googleapis.com获取GuzzleHttp(Mac上的php apache)时,我最终到了这里 .
这是我的最终解决方案,以防万一 .
查看证书链中的任何域名都会给您出现此错误 . 对我来说这是googleapis.com
你会得到这样的东西:
注意:我在修复问题后捕获了这个,你的链输出可能看起来不一样 .
然后你需要查看php中允许的证书 . 在页面中运行phpinfo() .
然后查找从页面输出加载的证书文件:
这是您需要通过向其添加正确的证书来修复的文件 .
您基本上需要将正确的证书“签名”附加到此文件的末尾 .
您可以在此处找到其中一些内容:如果需要,您可能需要谷歌/搜索链中的其他人 .
https://pki.google.com/
https://www.geotrust.com/resources/root-certificates/index.html
它们看起来像这样:
(注意:这是一个图像,所以人们不会简单地从stackoverflow复制/粘贴证书)
一旦正确的证书在此文件中,请重新启动apache并进行测试 .
解决方案非常简单!在
curl_exec
之前加上这一行:对我来说它有效 .