
后端【免费下载链接】YOURLS The standard, self hosted, powerful and customizable, URL shortener in PHP项目地址https://gitcode.com/gh_mirrors/yo/YOURLS点击查看免费下载导读composer/ca-bundle是一个轻量级 PHP 工具库其核心职责是帮你在运行时自动找到系统 CA 根证书包CA bundle的路径并在找不到可用系统证书时回退到随库内置的 Mozilla CA 根证书文件。它最初是 Composer 项目的一部分后被抽取为独立库。在 YOURLS 仓库中它作为第三方依赖被安装在 includes/vendor/composer/ca-bundle 目录下为 GeoIP2 Web Service 客户端等需要发起 HTTPS 请求的组件提供可信根证书来源。读完本文你将掌握该库的全部公开 API、三种主流 HTTP 客户端的接入方式以及其底层证书路径查找的完整优先级逻辑。为什么 PHP 应用需要这个库SSL 验证的经典痛点在 PHP 中通过 cURL 或流上下文访问https://资源时若没有显式配置 CA 证书CURLOPT_CAINFO/cafileOpenSSL 往往无法定位系统根证书导致SSL certificate problem: unable to get local issuer certificate之类的握手失败。问题在于不同操作系统、发行版的 CA bundle 存放路径差异极大Debian 系在/etc/ssl/certs/RHEL 系在/etc/pki/tls/certs/macOS Homebrew 又在别处某些精简环境中根本没有系统 CA 文件直接硬编码路径会让应用在迁移服务器后立刻失效。composer/ca-bundle的解决思路是按固定优先级探测一组已知的系统证书位置全部失败后回退到库内自带、随 Mozilla 根证书计划同步的cacert.pem从而保证任何环境下 HTTPS 请求都有可信根证书可用。安装与运行环境要求按官方 README 的标准方式在任意 Composer 项目中安装最新版本$ composer require composer/ca-bundle安装后包内包含三个关键部分见 includes/vendor/composer/ca-bundle路径作用src/CaBundle.php唯一的核心实现类命名空间Composer\CaBundleres/cacert.pem内置的 Mozilla 根证书包PEM 格式当前仓库中约 2957 行composer.json包元数据与依赖声明版本要求说明该库的 README 中写着 PHP 5.3.2 is required。不过当前 YOURLS 仓库锁定的是composer/ca-bundle1.5.12版本见 composer.lock 中第 68-85 行其 composer.json 实际声明的约束为require: { ext-openssl: *, ext-pcre: *, php: ^7.2 || ^8.0 }也就是说在 YOURLS 当前环境内运行该库需要 PHP 7.2 及以上含 8.x并启用 OpenSSL 与 PCRE 扩展。5.3.2 是早期版本的底线应以仓库内实际锁定的 1.5.12 声明为准。此外库的自动加载由 Composer 的 PSR-4 规则完成Composer\CaBundle\→src见 includes/vendor/composer/autoload_psr4.php。核心 API五个静态方法整个库只有一个类Composer\CaBundle\CaBundle全部为静态方法无需实例化方法功能CaBundle::getSystemCaRootBundlePath()返回系统 CA bundle 的路径找不到时回退到内置 bundle 的路径CaBundle::getBundledCaBundlePath()直接返回内置 CA 文件res/cacert.pem的路径CaBundle::validateCaFile($filename)在确认安全的前提下用openssl_x509_parse()校验某个 CA 文件是否合法CaBundle::isOpensslParseSafe()检测当前 PHP 的openssl_x509_parse()是否可安全使用与历史上 CVE-2013-6420 的 OpenSSL 远程代码执行漏洞相关CaBundle::reset()清空静态缓存$caPath与$caFileValidity强制下次调用重新探测其中getSystemCaRootBundlePath()与getBundledCaBundlePath()还接受一个可选的Psr\Log\LoggerInterface参数对应 PSR-3 日志规范用于输出每一步探测的调试信息例如Checked CA file /etc/ssl/certs/ca-certificates.crt: valid或No CA files found for pattern: ...见 src/CaBundle.php 中isFile、isReadable、glob等私有方法的日志实现。三个实战接入示例来自官方 README可直接运行getSystemCaRootBundlePath()的返回值可能是文件路径也可能是证书目录路径因此接入时必须用is_dir()判断后分别设置对应选项。1. 与 cURL 一起使用$curl curl_init(https://example.org/); $caPathOrFile \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath(); if (is_dir($caPathOrFile)) { curl_setopt($curl, CURLOPT_CAPATH, $caPathOrFile); } else { curl_setopt($curl, CURLOPT_CAINFO, $caPathOrFile); } $result curl_exec($curl);CURLOPT_CAINFO指向单个 PEM 证书文件CURLOPT_CAPATH指向包含多个证书的目录OpenSSL 会扫描该目录下的哈希命名文件。2. 与 PHP 流上下文一起使用$opts array( http array( method GET ) ); $caPathOrFile \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath(); if (is_dir($caPathOrFile)) { $opts[ssl][capath] $caPathOrFile; } else { $opts[ssl][cafile] $caPathOrFile; } $context stream_context_create($opts); $result file_get_contents(https://example.com, false, $context);这里通过ssl上下文选项的cafile/capath键完成同等配置适用于file_get_contents()等基于流包装器的 HTTPS 访问。3. 与 Guzzle 一起使用$client new \GuzzleHttp\Client([ \GuzzleHttp\RequestOptions::VERIFY \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath() ]);将VERIFY请求选项直接指向库返回的证书路径Guzzle 内部的 cURL 处理器即会将其作为CURLOPT_CAINFO使用。源码级解析系统证书的查找优先级getSystemCaRootBundlePath()的实现见 src/CaBundle.php 第 65-114 行按以下顺序逐一尝试命中第一个可用的即返回并缓存结果环境变量SSL_CERT_FILE模拟 OpenSSL 对该变量的处理方式指向单个证书/包文件环境变量SSL_CERT_DIR指向证书目录php.ini 的openssl.cafilephp.ini 的openssl.capath一组硬编码的发行版常见路径源码中带注释列举例如/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pemFedora / RHEL / CentOS新版 ca-certificates 包/etc/ssl/certs/ca-certificates.crtDebian / Ubuntu / Gentoo / Arch Linux/etc/ssl/ca-bundle.pemSUSE / openSUSE/usr/local/etc/openssl/cert.pem、/opt/homebrew/etc/openssl3/cert.pemmacOS Homebrew含 Apple Silicon 路径/etc/ssl/cert.pemOpenBSD、/etc/ssl/certsFreeBSD等共 15 个位置全部失败则回退getBundledCaBundlePath()返回内置的res/cacert.pem。所谓可用要经过三重检验对应私有方法caFileUsable文件存在is_file、可读is_readable、且能通过validateCaFile()的openssl_x509_parse()解析目录则要求存在、可读且glob()能扫到至少一个证书文件。两点值得注意的实现细节phar 兼容处理getBundledCaBundlePath()会检测返回路径是否以phar://开头——因为 cURL 无法直接读取 phar 内部的证书文件此时会把cacert.pem复制到系统临时目录并注册register_shutdown_function在脚本结束时自动清理临时文件见源码第 123-148 行。TRUSTED 证书前缀剥离validateCaFile()在解析前会用正则把BEGIN TRUSTED CERTIFICATE/END TRUSTED CERTIFICATE行改写为普通BEGIN CERTIFICATE形式因为openssl_x509_parse()不识别 Trusted 标记见源码第 169 行。内置证书包随 Mozilla 根证书同步的 cacert.pem仓库中随附的 includes/vendor/composer/ca-bundle/res/cacert.pem 头部注释明确说明证书数据来自 Mozilla 的根证书文件certdata.txt经由mk-ca-bundle.pl转换采用 PEM 格式可直接用于 cURL / libcurl / php_curl也可作为 Apachemod_ssl 的SSLCACertificateFile。文件头还带有生成时间与 SHA256 校验值便于核对完整性。这意味着即使部署环境完全没有任何系统证书HTTPS 请求依然具备一份持续更新的可信根集合可用。在 YOURLS 仓库中的实际应用虽然composer/ca-bundle是第三方依赖但它在 YOURLS 的 HTTPS 通信链路中承担着实打实的角色可以从源码中看到两类真实调用场景GeoIP2 Web Service 客户端includes/vendor/maxmind/web-service-common/src/WebService/Client.php 的getCaBundle()方法第 453-499 行调用CaBundle::getSystemCaRootBundlePath()获取证书路径再将其传给CurlRequestincludes/vendor/maxmind/web-service-common/src/WebService/Http/CurlRequest.php 第 85 行设置CURLOPT_CAINFO。该客户端还针对 macOS 的 SecureTransport 与 phar 打包场景做了特殊处理——足以说明这套系统证书优先 内置回退策略在生产级客户端中的典型用法。HTTP 请求库 rmccue/requestsincludes/vendor/rmccue/requests/src/Transport/Curl.php 与 Fsockopen.php 分别通过CURLOPT_CAINFO与流上下文cafile使用verify选项指定的证书路径与 README 中演示的两类接入方式一一对应。此外YOURLS 核心在 includes/functions-http.php 中提供yourls_can_http_over_ssl()第 759-773 行来探测服务器是否具备发起 HTTPS 请求的能力检查 cURL 的CURL_VERSION_SSL特性或 openssl 扩展与openssl_x509_parse函数版本检查等远程调用第 580-584 行会据此决定是否升级到 https——这为理解为什么 HTTPS 能力探测与 CA 证书配置密不可分提供了 YOURLS 侧的上下文。使用建议与注意事项路径结果要缓存复用库内部已有静态缓存reset()可清空同一进程内多次调用getSystemCaRootBundlePath()是零开销的无需自行再包一层。调试日志很有用将 PSR-3 Logger 传入方法可看到每一步探测被拒绝的具体原因文件不存在、不可读、目录中无证书等是排查为什么回退到了内置 bundle的最快手段。区分文件与目录返回值可能是证书文件也可能是证书目录务必像 README 示例那样用is_dir()分流后设置cafile/capath或CURLOPT_CAINFO/CURLOPT_CAPATH否则 cURL 会报错。isOpensslParseSafe()当前恒为 true从源码看该方法目前直接返回true其存在是为了历史兼容早期用于规避 CVE-2013-6420 对应的 OpenSSL 解析漏洞环境。版本差异若你的项目使用的不是 YOURLS 锁定的 1.5.12请以各自composer.json的实际 PHP 约束为准。许可证composer/ca-bundle以 MIT License 发布许可证全文见 includes/vendor/composer/ca-bundle/LICENSE。getSystemCaRootBundlePath()的实现思路源自 Evan Coury 的 Sslurp 项目BSD 许可其版权声明完整保留在 src/CaBundle.php 头部注释中集成使用该库时无需额外许可动作。赞分享后端【免费下载链接】YOURLS The standard, self hosted, powerful and customizable, URL shortener in PHP项目地址https://gitcode.com/gh_mirrors/yo/YOURLS点击查看免费下载相关推荐【亲测免费】 推荐composer/ca-bundle - 系统CA证书管理库推荐composer/ca bundle 系统CA证书管理库 1、项目介绍 composer/ca bundle 是一个轻量级的PHP库它专门用于查找并处理pip 的 HTTPS 证书验证完全指南自定义 CA 证书库与系统信任存储truststore机制解析pip 的 HTTPS 证书验证完全指南自定义 CA 证书库与系统信任存储truststore机制解析 pip 在通过 HTTPS 下载包时默认执行 SS包管理器开发工具Nebula 证书库cert完全指南v1/v2 证书格式、编解码与 CA 验证机制Nebula 证书库 cert 完全指南v1/v2 证书格式、编解码与 CA 验证机制 cert 是 Nebula 项目中用于创建、解析、签名和验证 Ne网络通信创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考