我在本地开发环境中使用WAMP,并且我正在尝试从信用卡收费但收到错误消息:
cURL错误60:SSL证书问题:无法获得本地颁发者证书
我在谷歌搜索了很多,很多人都建议我下载这个文件:cacert.pem,把它放在某处并在我的php.ini中引用它 . 这是我的php.ini中的一部分:
curl.cainfo = "C:\Windows\cacert.pem"
然而,即使多次重启我的服务器并更改路径,我也会收到相同的错误消息 .
我使用Apache模块中的WAMP并启用了ssl_module . 从PGP扩展我启用了php_curl .
仍然是相同的错误消息 . 为什么会这样?
现在我正在关注此修复程序:How to fix PHP CURL Error 60 SSL
这表明我将这些行添加到我的cURL选项中:
curl_setopt($process, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, true);
我在哪里添加选项到我的cURL?显然不是通过命令行,因为我的CLI没有找到命令“curl_setopt”
EDIT
这是我正在运行的代码:
public function chargeStripe()
{
$stripe = new Stripe;
$stripe = Stripe::make(env('STRIPE_PUBLIC_KEY'));
$charge = $stripe->charges()->create([
'amount' => 2900,
'customer' => Input::get('stripeEmail'),
'currency' => 'EUR',
]);
dd($charge);
// echo $charge[Input::get('stripeToken')];
return Redirect::route('step1');
}
17 回答
有一天,当Guzzle(5)脚本试图通过SSL连接到主机时,我出现了这个问题 . 当然,我可以在Guzzle / Curl中禁用VERIFY选项,但这显然不是正确的方法 .
我尝试了这里列出的所有内容和类似的线程,然后最终使用openssl进入终端来测试我尝试连接的域:
......并收到前几行表示:
...当尝试其他目的地时一切正常(例如:google.com等)
这促使我联系了我一直试图连接到的域名,事实上,他们在THEIR END上遇到了问题 . 它解决了,我的脚本又恢复了工作 .
所以...如果你把头发拉出来,给openssl一个镜头,看看你试图连接的位置是否有任何响应 . 也许这个问题毕竟不是那么“本地化” .
确保您的Window Explorer直接打开
php.ini
文件 . (在我的情况下:C:\DevPrograms\wamp64\bin\php\php5.6.25
) .在这种情况下,请勿使用Wamp / Xamp图标's menu in the System Tray. This shortcut doesn'中的
php.ini
快捷方式 .然后编辑
php.ini
:和
保存
php.ini
后,您不需要在Wamp图标中"Restart All Services"或关闭/重新打开CMD .这可能是一个边缘情况,但在我的情况下问题不是客户端conf(我已经在
php.ini
中配置了curl.cainfo
),而是远程服务器没有正确配置:它没有在链中发送任何中间证书 . 使用Chrome浏览网站没有错误,但是使用PHP我遇到了以下错误 .
在远程Web服务器配置中包含Intermediate Certs之后,它可以正常工作 .
您可以使用此站点检查服务器的SSL配置:
https://whatsmychaincert.com/
我所做的是在任何PHP脚本中使用
var_dump(openssl_get_cert_locations()); die;
,它给了我有关我的本地php正在使用的默认值的信息:您可以注意到,我已经设置了ini_cafile或ini选项curl.cainfo . 但就我而言,curl会尝试使用不存在的“default_cert_file” .
我将文件从https://curl.haxx.se/ca/cacert.pem复制到"default_cert_file"(c:/openssl-1.0.1c/ssl/cert.pem)的位置,我能够让它工作 .
这是我唯一的解决方案 .
工作方案:
类似于其他环境 - 在这里下载和解压缩cacert.pem(一个干净的文件格式/数据)
你的php.ini中的
curl.cainfo =“C:\ xampp \ php \ extras \ ssl \ cacert.pem”
问题解决了!
(来源:https://laracasts.com/discuss/channels/general-discussion/curl-error-60-ssl-certificate-problem-unable-to-get-local-issuer-certificate)
注意Wamp / Wordpress / windows用户 . 我有几个小时这个问题,甚至没有正确的答案是为我做的,因为我正在编辑错误的php.ini文件,因为问题已经回答了XAMPP而不是WAMP用户,即使问题是针对WAMP .
这就是我做的
下载certificate bundle.
把它放在
C:\wamp64\bin\php\your php version\extras\ssl
里面确保文件
mod_ssl.so
在C:\wamp64\bin\apache\apache(version)\modules
内在Apache目录
C:\wamp64\bin\apache\apache2.4.27\conf
的httpd.conf
中启用mod_ssl
在
php.ini
中启用php_openssl.dll
. 请注意我的问题是我有两个php.ini文件,我需要在这两个文件中执行此操作 . 第一个可以位于您的WAMP任务栏图标内 .另一个位于
C:\wamp64\bin\php\php(Version)
找到两个
php.ini
文件的位置,找到curl.cainfo =
行并给它一个这样的路径curl.cainfo = "C:\wamp64\bin\php\php(Version)\extras\ssl\cacert.pem"
现在保存文件并重新启动服务器,你应该好好去
我花了太多时间为我找出这个问题 .
我有PHP版本5.5,我需要升级到5.6 .
在版本<5.6中,Guzzle将使用它自己的cacert.pem文件,但是在更高版本的PHP它将使用系统的cacert.pem文件 .
我也从这里下载文件https://curl.haxx.se/docs/caextract.html并在php.ini中设置它 .
在Guzzles StreamHandler.php文件中找到答案https://github.com/guzzle/guzzle/blob/0773d442aa96baf19d7195f14ba6e9c2da11f8ed/src/Handler/StreamHandler.php#L437
你有没有尝试过..
如果您正在使用受信任的来源,可以说您不需要验证SSL证书 .
当我运行
'var_dump(php_ini_loaded_file());'
时,我在我的页面上得到此输出'C:\Development\bin\apache\apache2.4.33\bin\php.ini' (length=50)'
并获取PHP加载我的证书文件我必须编辑此路径
'C:\Development\bin\apache\apache2.4.33\bin\php.ini'
中的php.ini并添加openssl.cafile="C:/Development/bin/php/php7.2.4/extras/ssl/cacert.pem"
我已下载并从https://curl.haxx.se/docs/caextract.html放置我的证书文件我在Windows 10上,使用drupal 8,wamp和php7.2.4
如果您使用带有Guzzle的PHP 5.6,Guzzle已经切换到使用PHP库自动检测证书而不是它的进程(ref) . PHP概述了更改here .
找出PHP / Guzzle在哪里寻找证书
您可以转储PHP正在使用的位置:
获取证书包
对于OS X测试,您可以使用homebrew来安装openssl
brew install openssl
,然后在php.ini或Zend Server设置中使用openssl.cafile=/usr/local/etc/openssl/cert.pem
(在OpenSSL下) .卷曲网站上的curl / Mozilla也提供证书包:https://curl.haxx.se/docs/caextract.html
告诉PHP证书的位置
一旦你有了一个bundle,要么把它放在PHP已经看的地方(你在上面找到)或者在php.ini中更新
openssl.cafile
. (通常,在Unix上/etc/php.ini
或/etc/php/7.0/cli/php.ini
或/etc/php/php.ini
. )我找到了一个适合我的解决方案 . 我从最新的guzzle降级到版本~4.0并且它有效 .
在composer.json中添加“guzzlehttp / guzzle”:“~4.0”
希望它可以帮到某人
我刚刚使用了
guzzlehttp/guzzle
composer包的Laravel 4 php框架遇到了同样的问题 . 出于某种原因,邮件枪的SSL证书突然停止验证,我得到了相同的"error 60"消息 .如果像我一样,您在共享主机上而无法访问
php.ini
,则无法使用其他解决方案 . 在任何情况下,Guzzle都有这个客户端初始化代码,很可能会使php.ini
效果无效:Guzzle强制使用它自己的内部cacert.pem文件,该文件现在可能已过时,而不是使用cURL's environment提供的文件 . 更改此行(至少在Linux上)将Guzzle配置为使用cURL的默认SSL验证逻辑并修复我的问题:
如果你不是一个好的解决方案,你也可以将其设置为
false
.由于
vendor
中的文件并不意味着被篡改,因此更好的解决方案是使用configure the Guzzle client,但这在Laravel 4中实在太难了 .希望这可以节省其他人几个小时的调试时间......
当您使用Windows时,我认为您的路径分隔符是''(在Linux上为'/') . 尝试使用常量
DIRECTORY_SEPARATOR
. 您的代码将更加便携 .尝试:
编辑:并写出完整的路径 . 我有一些相对路径的问题(也许curl是从另一个基本目录执行的?)
cartalyst/stripe使用的Guzzle将执行以下操作以查找适当的证书存档以检查服务器证书:
检查php.ini文件中是否设置了
openssl.cafile
.检查php.ini文件中是否设置了
curl.cainfo
.检查
/etc/pki/tls/certs/ca-bundle.crt
是否存在(Red Hat,CentOS,Fedora;由ca-certificates包提供)检查是否存在
/etc/ssl/certs/ca-certificates.crt
(Ubuntu,Debian;由ca-certificates包提供)检查
/usr/local/share/certs/ca-root-nss.crt
是否存在(FreeBSD;由ca_root_nss包提供)检查是否
/usr/local/etc/openssl/cert.pem
(OS X;由自制软件提供)检查
C:\windows\system32\curl-ca-bundle.crt
是否存在(Windows)检查
C:\windows\curl-ca-bundle.crt
是否存在(Windows)您需要通过执行简单测试来确保正确定义前两个设置的值:
或者,尝试将文件写入#7或#8指示的位置 .
如果您无法更改php.ini,您还可以从以下代码中指向cacert.pem文件:
所有答案都是正确的; but the most important thing 是你必须找到合适的php.ini文件 . 在cmd " php --ini " is not the right answer 中检查此命令以查找正确的php.ini文件 .
如果你编辑
并检查
然后curl.cainfo应该有一个值 . if not then that's not right php.ini file;
***I recommend you to search *.ini in wamp/bin or xxamp/bin or any server you use and change them one by one and check it. ***
如果您使用WAMP,您还应该在php.ini中为Apache添加证书行(除了默认的php.ini文件):
适用于php5.3