Php cURL错误60:SSL证书:无法获取本地颁发者证书
我在本地开发环境中使用WAMP,试图向信用卡收费,但收到错误消息: cURL错误60:SSL证书问题:无法获取本地颁发者证书 我在谷歌上搜索了很多,很多人建议我下载这个文件:,把它放在某个地方,并在我的php.ini中引用它。这是my php.ini中的一部分:Php cURL错误60:SSL证书:无法获取本地颁发者证书,php,ssl,curl,wamp,stripe-payments,Php,Ssl,Curl,Wamp,Stripe Payments,我在本地开发环境中使用WAMP,试图向信用卡收费,但收到错误消息: cURL错误60:SSL证书问题:无法获取本地颁发者证书 我在谷歌上搜索了很多,很多人建议我下载这个文件:,把它放在某个地方,并在我的php.ini中引用它。这是my php.ini中的一部分: curl.cainfo = "C:\Windows\cacert.pem" 然而,即使在多次重新启动服务器并更改路径后,我仍会收到相同的错误消息 我使用Apache模块中的WAMP并启用了ssl_模块。从PGP扩展中,我启用了php_
curl.cainfo = "C:\Windows\cacert.pem"
然而,即使在多次重新启动服务器并更改路径后,我仍会收到相同的错误消息
我使用Apache模块中的WAMP并启用了ssl_模块。从PGP扩展中,我启用了php_curl
仍然显示相同的错误消息。为什么会这样
现在,我遵循以下修复方法:
这建议我在卷曲选项中添加以下线条:
curl_setopt($process, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, true);
在哪里向卷曲添加选项?显然不是通过命令行,因为我的CLI找不到命令“curl_setopt”
编辑
这是我正在运行的代码:
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');
}
当您使用Windows时,我认为您的路径分隔符是“\”(在Linux上是“/”。 尝试使用常量
目录\u分隔符
。您的代码将更易于移植
尝试:
编辑:并写入完整路径。我在相对路径方面遇到了一些问题(也许curl是从另一个基本目录执行的?您是否尝试过
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);
如果您使用的是受信任的源,则可以跳过验证。Guzzle(由使用)将执行以下操作以查找适当的证书存档,以检查服务器证书:
openssl.cafile
curl.cainfo
/etc/pki/tls/certs/ca bundle.crt是否存在(Red Hat、CentOS、Fedora;由ca证书包提供)
/etc/ssl/certs/ca certificates.crt
(Ubuntu、Debian;由ca证书包提供)/usr/local/share/certs/ca root nss.crt是否存在(FreeBSD;由ca\u root\u nss包提供)
/usr/local/etc/openssl/cert.pem
(OS X;由自制软件提供)C:\windows\system32\curl ca bundle.crt是否存在(windows)
C:\windows\curl ca bundle.crt是否存在(windows)
echo "openssl.cafile: ", ini_get('openssl.cafile'), "\n";
echo "curl.cainfo: ", ini_get('curl.cainfo'), "\n";
或者,尝试将文件写入由#7或#8指示的位置。我找到了一个适合我的解决方案。我从最新的guzzle版本降级到~4.0版本,它成功了 在composer.json中添加“guzzlehttp/guzzle”:“~4.0”
希望它能帮助别人如果您在Guzzle中使用PHP5.6,Guzzle已经转向使用PHP库自动检测证书,而不是它的进程()。PHP概述了这些变化 找出PHP/Guzzle在哪里寻找证书 您可以使用以下PHP命令转储PHP正在查看的位置:
var_dump(openssl_get_cert_locations());
获取证书包
对于OS X测试,您可以使用自制软件安装opensslbrew安装openssl
,然后在php.ini或Zend服务器设置(在openssl下)中使用openssl.cafile=/usr/local/etc/openssl/cert.pem
还可以从curl/Mozilla的curl网站上获得证书捆绑包:
告诉PHP证书在哪里
一旦你有了一个包,要么把它放在PHP已经在寻找的地方(你在上面找到了),要么在PHP.ini中更新
openssl.cafile
。(通常,Unix上的/etc/php.ini
或/etc/php/7.0/cli/php.ini
或/etc/php/php.ini
)工作解决方案假设您在Windows上使用XAMPP:
XAMPP服务器
- 在此处下载并提取cacert.pem(干净的文件格式/数据)
(参考:)有一天,当Guzzle(5)脚本试图通过SSL连接到主机时,我突然发现了这个问题。当然,我可以在Guzzle/Curl中禁用VERIFY选项,但这显然不是正确的方法 我尝试了这里和类似线程中列出的所有内容,然后最终使用openssl终端对我尝试连接的域进行测试:
openssl s_client -connect example.com:443
。。。并收到前几行指示:
CONNECTED(00000003)
depth=0 CN = example.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = example.com
verify error:num=21:unable to verify the first certificate
verify return:1
。。。在尝试其他目的地(如:google.com等)时,一切正常
这促使我联系了我一直试图连接的域名,事实上,他们的终端出现了一个问题。问题解决了,我的脚本又开始工作了
所以。。。如果您正在尝试连接,请尝试一下openssl,看看您尝试连接的位置的响应是否有任何问题。有时,问题可能并不那么“局部”。如果您无法更改php.ini,您也可以从以下代码中指向cacert.pem文件:
$http = new GuzzleHttp\Client(['verify' => '/path/to/cacert.pem']);
$client = new Google_Client();
$client->setHttpClient($http);
我所做的是使用
var_dump(openssl_get_cert_locations());死亡
在任何php脚本中,它为我提供了有关本地php使用的默认值的信息:
array (size=8)
'default_cert_file' => string 'c:/openssl-1.0.1c/ssl/cert.pem' (length=30)
'default_cert_file_env' => string 'SSL_CERT_FILE' (length=13)
'default_cert_dir' => string 'c:/openssl-1.0.1c/ssl/certs' (length=27)
'default_cert_dir_env' => string 'SSL_CERT_DIR' (length=12)
'default_private_dir' => string 'c:/openssl-1.0.1c/ssl/private' (length=29)
'default_default_cert_area' => string 'c:/openssl-1.0.1c/ssl' (length=21)
'ini_cafile' => string 'E:\xampp\php\extras\ssl\cacert.pem' (length=34)
'ini_capath' => string '' (length=0)
正如您所注意到的,我已经设置了ini_cafile或ini选项curl.cainfo。但是在我的例子中,curl会尝试使用“default\u cert\u文件”,它并不存在
我将文件从复制到“默认证书文件”(c:/openssl-1.0.1c/ssl/cert.pem)的位置,并能够使其工作
这是我唯一的解决方案。请确保直接通过窗口资源管理器打开
php.ini
文件。(在我的例子中:C:\DevPrograms\wamp64\bin\php\p
$http = new GuzzleHttp\Client(['verify' => '/path/to/cacert.pem']);
$client = new Google_Client();
$client->setHttpClient($http);
array (size=8)
'default_cert_file' => string 'c:/openssl-1.0.1c/ssl/cert.pem' (length=30)
'default_cert_file_env' => string 'SSL_CERT_FILE' (length=13)
'default_cert_dir' => string 'c:/openssl-1.0.1c/ssl/certs' (length=27)
'default_cert_dir_env' => string 'SSL_CERT_DIR' (length=12)
'default_private_dir' => string 'c:/openssl-1.0.1c/ssl/private' (length=29)
'default_default_cert_area' => string 'c:/openssl-1.0.1c/ssl' (length=21)
'ini_cafile' => string 'E:\xampp\php\extras\ssl\cacert.pem' (length=34)
'ini_capath' => string '' (length=0)
curl.cainfo ="C:/DevPrograms/wamp64/bin/php/cacert.pem"
openssl.cafile="C:/DevPrograms/wamp64/bin/php/cacert.pem"
[curl]
curl.cainfo = C:\your_location\cacert.pem
// vendor/guzzlehttp/guzzle/src/Client.php
$settings = [
'allow_redirects' => true,
'exceptions' => true,
'decode_content' => true,
'verify' => __DIR__ . '/cacert.pem'
];
'verify' => true
// PHP 5.6 or greater will find the system cert by default. When
// < 5.6, use the Guzzle bundled cacert.
curl.cainfo ="PATH/cacert.pem"
var_dump(openssl_get_cert_locations());
$options = [
'defaults' => ['verify' => false],
];
new GuzzleClient($options);
['verify' => '/path/to/cacert.pem']