如何为PHP全局设置CURLOPT_CAINFO?

如何为PHP全局设置CURLOPT_CAINFO?,php,ssl,curl,Php,Ssl,Curl,我知道我可以在任何特定实例上设置该选项,但是我真正想要的是设置php.ini或类似的东西,它将在所有项目和所有实例中处理这个问题 有人知道我要怎么做吗 编辑: 我特别感兴趣的是一种解决方案,它允许证书位于不同服务器上的不同位置 我正在一台Windows机器上开发,它需要这个,但部署到一台Linux服务器上,该服务器不仅不需要它,而且甚至没有指定的路径 我知道我可以使用条件来检查代码在哪里运行,但我更愿意让它开箱即用。在我看来,这确实是curl和PHP要处理的问题,而不是我的代码,因此它的设置应该

我知道我可以在任何特定实例上设置该选项,但是我真正想要的是设置php.ini或类似的东西,它将在所有项目和所有实例中处理这个问题

有人知道我要怎么做吗

编辑: 我特别感兴趣的是一种解决方案,它允许证书位于不同服务器上的不同位置

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


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

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

例如:

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

下面是一个补丁,用于“模拟”在构建时发现有效crt数据时在linux上看到的内容(几乎所有发行版都是如此):

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

可以在此处获取cacert数据:

php 5.3的DLL可在以下位置找到: php 5.2的DLL可在以下位置找到:

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

我在这里找到了答案(在用户说明中):

只需将此添加到您的.ini(注意:您不能使用
ini\u set
,尽管我不知道您为什么要使用。谢谢@Carlton):

并从以下位置获取该文件:


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

@马特是对的,但是我要补充的是,curl.cainfo是一个PHP\u INI\u系统指令,因此您必须在PHP.INI中设置它……在脚本中使用INI\u set函数总是会返回false,因为我在头部撞击太多分钟后发现这一点

  • 下载cacert.pem添加到php文件夹
  • 将url复制到文件cacert.pem的位置
  • [curl]curl.cainfo=“C:/xampp/php/cacert.pem”

  • 我应该澄清一下,我正在寻找一个解决方案,允许我在需要的Windows上本地开发,并部署到不需要的另一台服务器上。这正是我想要解决的问题。在我的例子中,我使用的是一个框架,它将所有的curl调用封装在它的类层次结构中,因此如果我需要使它工作,我实际上需要修补框架。虽然这并不困难,但它有明显的缺点和负面影响。因此,从外部设置此选项的可能性可能非常有用。仅供参考:我已将补丁应用于php src、5.3及更高版本。谢谢!PHP5.2NTS的补丁.dll工作得很好。(Zend Server CE附带的Win7、PHP 5.2发行版)链接不再起作用,但这正是我需要的。对于那些使用HexChat的人,它还附带一个证书列表(
    HexChat\cert.pem
    )。使用它的优点是,无论何时更新HexChat,它都会自动更新。
    curl.cainfo=c:\php\cacert.pem