【问题标题】:How can I set CURLOPT_CAINFO globally for PHP?如何为 PHP 全局设置 CURLOPT_CAINFO?
【发布时间】:2011-02-11 07:03:42
【问题描述】:

我知道我可以在任何特定实例上设置选项,但我真正想要的是设置 php.ini 或类似的东西来处理所有项目和所有实例。

有没有人知道我可以做到这一点的方法?

编辑: 我对允许证书位于不同服务器上的不同位置的解决方案特别感兴趣。

我正在一台需要它的 Windows 机器上进行开发,但部署到一台 Linux 服务器上,它不仅不需要它,而且甚至没有指明路径。

我知道我可以使用条件来检查代码在哪里运行,但我更愿意让它开箱即用。在我看来,这确实是 curl 和 PHP 处理的问题,而不是我的代码,因此它的设置属于那里。

【问题讨论】:

  • 这正是我想解决的问题。在我的例子中,我使用的是一个框架,它把所有的 curl 调用都封装在它的类层次结构中,所以如果我需要让它工作,我实际上需要修补框架。虽然这并不难,但它有明显的缺点和缺点。因此,从外部设置此选项的可能性非常有帮助。

标签: php ssl curl


【解决方案1】:

我在这里找到了答案(在用户注释中):http://php.net/manual/en/function.curl-setopt.php

只需将其添加到您的 .ini 中(注意:您不能使用 ini_set,尽管我不知道您为什么要这样做。谢谢@Carlton):

curl.cainfo=c:\php\cacert.pem

并从以下位置获取该文件:http://curl.haxx.se/docs/caextract.html

有效,您不会为 MITM 攻击敞开心扉

【讨论】:

  • 对于那些使用HexChat的人,它还附带一个证书列表(Hexchat\cert.pem)。使用它的好处是它会在您更新 HexChat 时自动更新。
【解决方案2】:

当在构建时找到有效的 crt 数据时,这是一个“模拟”我们在 linux 上看到的补丁(几乎所有发行版都是这种情况):

http://www.php.net/~pierre/patches/curl_cacert_default.txt

它添加了一个(系统)ini设置来定义cacert的路径,curl.cainfo=c:\curl\ca.crt

cacert 数据可以在这里获取:http://curl.haxx.se/docs/caextract.html

php 5.3 的 DLL 可以在这里找到:http://www.php.net/~pierre/test/curl-5.3-vc9-x86-ts-nts-cainfodefault.zip php 5.2 的 DLL 可以在这里找到:http://www.php.net/~pierre/test/curl-5.2-cainfodefault.zip

请告诉我它是如何工作的。

【讨论】:

  • 仅供参考:我应用了应用于 php src、5.3 及更高版本的补丁。
  • 谢谢!为 PHP 5.2 nts 打补丁的 .dll 效果很好。 (Zend Server CE 附带的 Win7、PHP 5.2 发行版)
  • 链接不再起作用,但这正是我所需要的
【解决方案3】:
  1. 下载 cacert.pem 添加到文件夹 php
  2. 将 url 复制到文件 cacert.pem 的位置
  3. [curl] curl.cainfo="C:/xampp/php/cacert.pem"

【讨论】:

    【解决方案4】:

    @Matt 是对的,但我要补充一点,curl.cainfo 是一个 PHP_INI_SYSTEM 指令,因此您必须在 php.ini 中设置它...在脚本中使用 ini_set 函数将始终返回 false,因为我在头撞了太多分钟后发现

    【讨论】:

      【解决方案5】:

      您可以创建一个包装函数来设置选项并使用 php.ini 的 auto_prepend_file 来加载它定义的文件,但您的代码必须更改为使用此包装函数。

      例子:

      function my_curl_init($url=null) {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_CAINFO, getcwd().'/cert/ca.crt');
        return $ch;
      }
      

      【讨论】:

      • 我应该澄清一下,我正在寻找一种解决方案,允许我在需要的地方在 Windows 上进行本地开发,并在不需要的地方部署到另一台服务器。
      猜你喜欢
      • 2013-11-10
      • 2017-12-06
      • 2017-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-05
      • 1970-01-01
      相关资源
      最近更新 更多