使用curl时,出于安全考虑,我如何保持我的cacert.pem的最新状态


How do I keep my cacert.pem current for security reasons when using curl?

我想让我的根证书保持最新,以便与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的本地副本,这样当我在PHP中使用curl与其他服务器通信时,我就可以继续安全地执行

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

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

此外,随着技术的进步,这个问题已经更新,以展示如何在PHP中使用curl并强制TLS v1.2连接(某些事务提供商需要或建议使用,但可能不会提供有关如何做到这一点的信息)。

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

  • 赛门铁克
  • RapidSSL
  • thawte
  • GeoTrust
  • 科莫多

以及其他性质的机构,如

  • Microsoft
  • Mozilla
  • 谷歌

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

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

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

  • curl作者生成的cacert.pem
  • caextract:为了最具安全意识,请下载该工具,检查源代码,并在您自己的Firefox上运行它