cURL错误60:SSL证书:无法获取本地颁发者证书
我在本地开发环境中使用WAMP,并试图收取信用卡,但收到错误消息:
cURL错误60:SSL证书问题:无法获取本地颁发者证书
我在Google上search了很多,很多人build议我下载这个文件: cacert.pem ,把它放在某个地方,并在我的php.ini中引用它。 这是我的php.ini中的一部分:
curl.cainfo = "C:\Windows\cacert.pem"
但是,即使重新启动我的服务器多次并更改path后,我也会得到相同的错误消息。
我使用Apache模块中的WAMP并启用了ssl_module。 从PGP扩展我有php_curl启用。
还是一样的错误信息。 为什么会这样呢?
现在我正在关注此修复: 如何修复PHP CURL Error 60 SSL
这表明我将这些行添加到我的cURL选项中:
curl_setopt($process, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem'); curl_setopt($process, CURLOPT_SSL_VERIFYPEER, true);
我在哪里添加选项到我的cURL? 显然不是通过命令行,因为我的CLI没有find命令“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'); }
工作scheme:
- 假设在Windows上
XAMPP服务器
类似于其他的环境 – 在这里下载并提取cacert.pem(一个干净的文件格式/数据)
- 把它放在这里
C:\ XAMPP \ PHP \演员\ SSL \ cacert.pem
- 在你的php.ini文件中放入这一行(“c:\ xampp \ php \ php.ini”):
;;;;;;;;;;;;;;;;;;;; ; php.ini Options ; ;;;;;;;;;;;;;;;;;;;; curl.cainfo = "C:\xampp\php\extras\ssl\cacert.pem"
- 重启你的web服务器/ apache
问题解决了!
(来源: https : //laracasts.com/discuss/channels/general-discussion/curl-error-60-ssl-certificate-problem-unable-to-get-local-issuer-certificate )
如果您正在使用PHP 5.6与Guzzle,Guzzle已经切换到使用PHP库自动检测证书,而不是它的过程( ref )。 PHP概述了这里的变化。
找出哪里PHP / Guzzle正在寻找证书
你可以转储PHP正在寻找使用:
var_dump(openssl_get_cert_locations());
获得证书包
对于OS Xtesting,您可以使用自制软件安装openssl brew install openssl
,然后在您的php.ini或Zend Server设置(OpenSSL下)中使用openssl.cafile=/usr/local/etc/openssl/cert.pem
。
curl网站上的curl / Mozilla也提供证书包: https : //curl.haxx.se/docs/caextract.html
告诉PHP证书在哪里
一旦你有了一个bundle,把它放在PHP已经看到的地方(你在上面find的),或者在php.ini中更新openssl.cafile
。 (一般来说,Unix上的/etc/php.ini
或/etc/php/7.0/cli/php.ini
或/etc/php/php.ini
)
由cartalyst / stripe使用的Guzzle将执行以下操作来查找适当的证书归档,以检查服务器证书是否符合以下条件:
- 检查你的php.ini文件是否设置了
openssl.cafile
。 - 检查
curl.cainfo
是否在您的php.ini文件中设置。 - 检查是否存在
/etc/pki/tls/certs/ca-bundle.crt
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
X;由homebrew提供) - 检查是否存在
C:\windows\system32\curl-ca-bundle.crt
(Windows) - 检查是否存在
C:\windows\curl-ca-bundle.crt
(Windows)
您将需要确保前两个设置的值通过简单testing正确定义:
echo "openssl.cafile: ", ini_get('openssl.cafile'), "\n"; echo "curl.cainfo: ", ini_get('curl.cainfo'), "\n";
或者,尝试将文件写入#7或#8所示的位置。
我find了一个适合我的解决scheme。 我从最新的版本降级到版本4.0,它工作。
在composer.json中添加“guzzlehttp / guzzle”:“〜4.0”
希望它可以帮助别人
如果你不能改变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()); die;
var_dump(openssl_get_cert_locations()); die;
在任何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_cert_file”。
这是我唯一的解决scheme。
当一个Guzzle(5)脚本尝试通过SSL连接到主机时,我有一天出现了这个问题。 当然,我可以禁用Guzzle / Curl中的VERIFY选项,但这显然不是正确的方法。
我尝试了所有列在这里和类似的线程,然后最终与opensslterminal去testing我试图连接的域:
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等)
这促使我联系了我一直在尝试连接的域名,事实上,他们在结尾已经出现了问题。 它已经解决了,我的脚本重新开始工作了。
所以……如果你把你的头发拉出来,给你一个机会,看看你试图连接的位置有没有什么反应。 也许这个问题毕竟有时候不是那么“本地”的。
你有没有尝试过..
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);
如果你正在消费一个值得信赖的来源,那么你不需要validationSSL证书。
确保你的Window Explorer直接打开php.ini
文件。 (在我的情况下: C:\DevPrograms\wamp64\bin\php\php5.6.25
)。
不要在System Tray的Wamp / Xamp图标菜单中使用php.ini
的快捷方式。 这种快捷方式在这种情况下不起作用。
然后编辑php.ini
:
curl.cainfo ="C:/DevPrograms/wamp64/bin/php/cacert.pem"
和
openssl.cafile="C:/DevPrograms/wamp64/bin/php/cacert.pem"
保存php.ini
您不需要在“重新启动所有服务”的Wamp图标或closures/重新打开CMD。
如果您使用WAMP,则还应该在php.ini中为Apache添加证书行(除了默认的php.ini文件):
[curl] curl.cainfo = C:\your_location\cacert.pem
适用于php5.3 +
当你使用Windows时,我认为你的path分隔符是'\'(在Linux上是'/')。 尝试使用常量DIRECTORY_SEPARATOR
。 你的代码将更加便携。
尝试:
curl_setopt($process, CURLOPT_CAINFO, dirname(__FILE__) . DIRECTORY_SEPARATOR . 'cacert.pem');
编辑:并写完整的path。 我有一些相对path的问题(也许curl从另一个基地目录执行?)