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

以及使用示例 curl 在 PHP 中用于安全连接,需要一个名为 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 那就太好了,它不以任何形式存在。

有帮助吗?

解决方案

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

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

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

  • 赛门铁克
  • 快速SSL
  • 解冻
  • 地质信托公司
  • 科摩多

以及其他性质上的权威机构,例如

  • 微软
  • 莫兹拉
  • 谷歌

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

其他提示

cacert.pem 被使用 curl. 。不存在值得信任的证书的最终权威,但是 网络浏览器使用的列表是一个很好的来源. 。由于 CA 的变更和安全实践的变化,这些列表会不断更新。

的作者 curl 维护一个可以提取的工具 cacert.pem 来自 Firefox,并在其网站上发布了相当最新的输出:

  • cacert.pem 由作者生成 curl
  • 提取物: :对于最具安全意识的人,请下载该工具,检查源代码并在您自己的 Firefox 上运行它。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top