在使用curl时,如何出于安全原因保持cacert.pem电流?

问题描述 投票:10回答:2

我想保持我的根证书最新用于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,因此忽略了问题,which is bad。你可以see here where a certificate authority shows that if you do not have this file current, the only way to connect to a secure server is to disable certificate checking and further warns of the implications behind disabling peer verification

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

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

php curl mozilla pem php-openssl
2个回答
22
投票

自从最初写这篇文章(并因此重写)以来,我能够通过直接将链接包含到维护此文件的唯一合法来源来解决我自己的问题,该文件由curlthis location作者维护的网站上提供。

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

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

  • 赛门铁克
  • 的RapidSSL
  • Thawte的
  • GeoTrust的
  • 自在

以及其他当局的性质如

  • 微软
  • Mozilla的
  • 谷歌

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


12
投票

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

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

  • cacert.pemcurl的作者生成
  • caextract:为了最安全,请下载该工具,检查源代码并针对您自己的Firefox运行它。
© www.soinside.com 2019 - 2024. All rights reserved.