Lov*_*ess 206 php ssl curl wamp stripe-payments
我在本地开发环境中使用WAMP,我正在尝试从信用卡收费,但收到错误消息:
cURL错误60:SSL证书问题:无法获取本地颁发者证书
我在Google上搜索了很多,很多人都建议我下载这个文件:cacert.pem,把它放在某处并在我的php.ini中引用它.这是我的php.ini中的一部分:
curl.cainfo = "C:\Windows\cacert.pem"
然而,即使多次重启我的服务器并更改路径,我也会收到相同的错误消息.
我使用Apache模块中的WAMP并启用了ssl_module.从PGP扩展我启用了php_curl.
仍然是相同的错误消息.为什么会这样?
现在我正在关注此修复程序:如何修复PHP CURL错误60 SSL
这表明我将这些行添加到我的cURL选项中:
curl_setopt($process, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, true);
我在哪里添加选项到我的cURL?显然不是通过命令行,因为我的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');
}
Dun*_*ung 467
工作方案:
XAMPP服务器
类似于其他环境 - 在这里下载和解压缩cacert.pem(一个干净的文件格式/数据)
C:\ XAMPP\PHP \演员\ SSL\cacert.pem
Run Code Online (Sandbox Code Playgroud);;;;;;;;;;;;;;;;;;;; ; php.ini Options ; ;;;;;;;;;;;;;;;;;;;; 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)
Lor*_*ren 42
如果你使用带有Guzzle的PHP 5.6,Guzzle已经转而使用PHP库自动检测证书而不是它的进程(ref).PHP概述了这里的变化.
您可以转储PHP正在使用的位置:
 var_dump(openssl_get_cert_locations());
对于OS X测试,您可以使用homebrew安装openssl brew install openssl,然后openssl.cafile=/usr/local/etc/openssl/cert.pem在php.ini或Zend Server设置中使用(在OpenSSL下).
curl网站上的curl/Mozilla也提供了证书包:https://curl.haxx.se/docs/caextract.html
一旦你有了一个bundle,要么把它放在PHP已经看的地方(你在上面找到)或者openssl.cafile在php.ini中更新.(通常,/etc/php.ini或/etc/php/7.0/cli/php.ini或/etc/php/php.ini在Unix).
Ram*_*our 41
注意Wamp/Wordpress/windows用户.我有这个问题好几个小时,甚至没有正确的答案是为我做的,因为我正在编辑错误的php.ini文件,因为问题是回答XAMPP而不是WAMP用户,即使问题是针对WAMP.
这就是我做的
下载证书包.
把它放在里面 C:\wamp64\bin\php\your php version\extras\ssl
确保文件mod_ssl.so在里面C:\wamp64\bin\apache\apache(version)\modules
mod_ssl在httpd.confApache目录内启用C:\wamp64\bin\apache\apache2.4.27\conf
启用php_openssl.dll在php.ini.请注意我的问题是我有两个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"
现在保存文件并重新启动服务器,你应该好好去
Ja͢*_*͢ck 15
由bualyst/stripe使用的Guzzle将执行以下操作以查找适当的证书存档以检查服务器证书:
openssl.cafile在php.ini文件中设置了.curl.cainfo在php.ini文件中设置了./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)您需要通过执行简单测试来确保正确定义前两个设置的值:
echo "openssl.cafile: ", ini_get('openssl.cafile'), "\n";
echo "curl.cainfo: ", ini_get('curl.cainfo'), "\n";
或者,尝试将文件写入#7或#8指示的位置.
mva*_*len 12
如果您无法更改php.ini,您还可以从以下代码中指向cacert.pem文件:
$http = new GuzzleHttp\Client(['verify' => '/path/to/cacert.pem']);
$client = new Google_Client();
$client->setHttpClient($http);
小智 7
我所做的是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)的位置,我能够得到它上班.
这是我唯一的解决方案.
我找到了一个适合我的解决方案.我从最新的guzzle降级到版本~4.0并且它有效.
在composer.json中添加"guzzlehttp/guzzle":"~4.0"
希望它可以帮助某人
有一天,当一个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等)
这促使我联系了我一直试图连接的域名,事实上,他们在THEIR END上遇到了问题.它解决了,我的脚本又恢复了工作.
所以...如果你要拔掉头发,请给openssl一个镜头,看看你试图连接的位置是否有任何响应.也许问题毕竟不是那么"本地化".
对于 WAMP,这最终对我有用。
虽然它与其他解决方案类似,但此页面和网络上其他位置提到的解决方案不起作用。一些“次要”细节有所不同。
保存 PEM 文件的位置很重要,但指定得不够明确。
或者php.ini要编辑的哪个文件不正确。或两者。
我在 Windows 10 计算机上运行 2020 年安装的 WAMP 3.2.0。
http://curl.haxx.se/ca/cacert.pem
复制整个页面并将其另存为:cacert.pem,位于下面提到的位置。
<wamp install directory>\bin\php\php<version>\extras\ssl
例如保存的文件和路径:“T:\wamp64\bin\php\php7.3.12\extras\ssl\cacert.pem”
* (我最初将其保存在其他位置(并在 php.ini 文件中指示了保存位置,但这不起作用)。其他位置可能也可能不起作用。这是推荐的位置 - 我不这样做知道为什么。)
WHERE 
<wamp install directory>= WAMP 安装路径。
例如:  T:\wamp64\
<php version>WAMP 正在运行的 php 的:(要查找,请转到:WAMP icon tray ->  PHP   <version number>
如果显示的版本号是 7.3.12,则目录将为:php7.3.12)
例如:php7.3.12
要打开正确的php.ini文件进行编辑,请转到:WAMP icon tray ->  PHP -> php.ini。
例如:T:\wamp64\bin\apache\apache2.4.41\bin\php.ini
注意:它不是 php 目录中的文件!
更新:
虽然看起来我正在编辑 file:    T:\wamp64\bin\apache\apache2.4.41\bin\php.ini,但
实际上正在编辑该文件的符号链接目标:   T:/wamp64/bin/php/php7.3.12/phpForApache.ini。
请注意,如果您按照上述说明操作,则不会php.ini直接编辑文件。您实际上正在编辑一个phpForApache.ini文件。(包含有关符号链接信息的帖子)
如果您阅读各个 WAMP 目录中某些文件顶部的注释php.ini,它会明确指出不要编辑该特定文件。
确保您打开进行编辑的文件不包含此警告。
安装扩展 Link Shell Extension允许我通过添加的选项卡在文件 Properites 窗口中查看符号链接的目标。这是我的一个答案,其中包含有关此扩展的更多信息。
如果您在不同时间运行不同版本的 php,则可能需要将 PEM 文件保存在每个相关的 php 目录中。
将 PEM 文件的路径粘贴到以下位置。
取消注释;curl.cainfo =并粘贴到 PEM 文件的路径。
例如:curl.cainfo = "T:\wamp64\bin\php\php7.3.12\extras\ssl\cacert.pem"
取消注释;openssl.cafile=并粘贴到 PEM 文件的路径。
例如:openssl.cafile="T:\wamp64\bin\php\php7.3.12\extras\ssl\cacert.pem"
学分:
虽然不是官方资源,但这里有一个返回 YouTube 视频的链接,该视频为我理清了最后的细节:https://www.youtube.com/watch? v=Fn1V4yQNgLs 。
你有没有尝试过..
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);
如果您使用的是可信来源,则可以跳过验证。
确保您php.ini直接通过窗口资源管理器打开文件。(在我的情况下:)C:\DevPrograms\wamp64\bin\php\php5.6.25。
不要使用php.ini系统托盘中 Wamp/Xamp 图标菜单中的快捷方式。在这种情况下,此快捷方式不起作用。
然后编辑php.ini:
curl.cainfo ="C:/DevPrograms/wamp64/bin/php/cacert.pem" 
和
openssl.cafile="C:/DevPrograms/wamp64/bin/php/cacert.pem"
保存后,php.ini您无需在 Wamp 图标中“重新启动所有服务”或关闭/重新打开 CMD。
| 归档时间: | 
 | 
| 查看次数: | 197289 次 | 
| 最近记录: |