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(一个干净的文件格式/数据)

https://curl.haxx.se/docs/caextract.html

  • 把它放在这里

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将执行以下操作来查找适当的证书归档,以检查服务器证书是否符合以下条件:

  1. 检查你的php.ini文件是否设置了openssl.cafile
  2. 检查curl.cainfo是否在您的php.ini文件中设置。
  3. 检查是否存在/etc/pki/tls/certs/ca-bundle.crt Hat,CentOS,Fedora;由ca-certificates包提供)
  4. 检查/etc/ssl/certs/ca-certificates.crt存在(Ubuntu,Debian;由ca-certificates包提供)
  5. 检查/usr/local/share/certs/ca-root-nss.crt存在(FreeBSD;由ca_root_nss包提供)
  6. 检查/usr/local/etc/openssl/cert.pem X;由homebrew提供)
  7. 检查是否存在C:\windows\system32\curl-ca-bundle.crt (Windows)
  8. 检查是否存在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”。

我将文件从https://curl.haxx.se/ca/cacert.pem复制到“default_cert_file”(c:/openssl-1.0.1c/ssl/cert.pem)的位置,我能够得到它上class。;

这是我唯一的解决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从另一个基地目录执行?)