11

我想让我的根证书保持最新,以便与 cURL 和 PHP 的内部curl命令一起使用,但是目前没有参数可以下载正确安全连接所需的当前文件并保持最新。

在 PHP 中使用安全连接的示例curl需要一个名为cacert.pem(PEM 编码的证书链用于验证远程连接)的文件,如下所示:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://www.google.com");
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_CAINFO, "pathto/cacert.pem");
curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);
if (!($data = curl_exec($ch))) {
    echo "No data received";
} else {
    echo strlen($data) + " total byte(s)";
}
curl_close($ch);

而大多数人只是简单地设置CURLOPT_SSL_VERIFYPEER为 false,从而忽略了这个问题,这很糟糕。您可以在此处看到证书颁发机构显示,如果您没有当前文件,则连接到安全服务器的唯一方法是禁用证书检查并进一步警告禁用对等验证背后的含义

我要求的是一种维护本地副本的合法方式,cacert.pem以便当我curl在 PHP 中使用与其他服务器通信时,我可以继续安全地这样做。

这不是对外部资源或非现场链接等的请求,但是由于问题的性质,这可能是解决此问题的唯一方法,因为它需要在证书链被吊销时不断更新。迄今为止,无论是作为 curl 本身、php 或 php 的 curl 库的一部分,都无法获取此文件并继续维护它。虽然令人沮丧的是,这不是一个简单的更新命令curl --update-root-ca会很好的东西,但它不以任何形式存在。

4

2 回答 2

22

自从最初写这篇文章(以及因此重写)以来,我能够通过直接包含指向唯一合法来源的链接来解决我自己的问题,以维护这个文件的作者curl这个位置维护的网站上提供的这个文件

此外,随着技术的进步,这个问题已经更新,以展示如何curl在 PHP 中使用并强制 TLS v1.2 连接(某些交易提供商要求或推荐的东西,并且可能不提供有关如何执行此操作的信息)。

关于证书颁发机构,有一些关键的根颁发机构,例如:

  • 赛门铁克
  • RapidSSL
  • 解冻
  • 地理信托
  • 科莫多

以及其他当局的性质,例如

  • 微软
  • Mozilla
  • 谷歌

对于希望维护自己的 cacert.pem 的任何人来说,这都是一个框架。请记住,您需要从各自的 crl 下载他们的吊销列表(已被破坏或过期的证书)以维持适当的信任机制,而您应该能够只下载他们的根证书链并使用那些作为本地权威文件作为您的 cacert.pem。

于 2014-04-12T15:45:45.453 回答
13

cacert.pem由 使用curl。没有最终权威机构可以信任哪些证书,但Web 浏览器使用的列表是一个很好的来源。由于 CA 更改和安全实践的更改,这些列表会不断更新。

作者curl维护了一个可以从 Firefox 中提取 a 的工具cacert.pem,并在他们的网站上发布合理的最新输出:

  • cacert.pem的作者生成curl
  • caextract:对于最注重安全的人,请下载该工具,检查源代码并在您自己的 Firefox 上运行它。
于 2014-10-16T00:57:40.450 回答