XAMPP 的 cURL 证书错误源于内置 CA 包过时,正确做法是下载 Mozilla 维护的 cert.pem 并通过 php.ini 中 curl.cainfo 指定路径,重启服务后生效,同时需确保 CLI 和 Apache 使用同一配置。

为什么 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true) 会报证书错误
XAMPP 自带的 PHP cURL 默认启用 SSL 证书验证,但其内置的 curl-ca-bundle.crt 文件长期未更新,2023 年后大量根证书(如 ISRG Root X1 的交叉签名、DST Root CA X3 过期)已失效或被移除,导致访问 HTTPS 站点时抛出类似 CURLOPT_SSL_VERIFYPEER failed: unable to get local issuer certificate 的错误。
这不是你的代码问题,而是 XAMPP 捆绑的 CA 证书包过时了。官方不再维护该文件,且新版 OpenSSL(XAMPP 8.0+ 内置)默认更严格校验链完整性。
- 不要直接设
CURLOPT_SSL_VERIFYPEER为false—— 这会彻底关闭证书验证,存在中间人攻击风险 - 不要手动下载任意网站提供的 crt 文件 —— 来源不可信,可能被篡改
- 正确做法是替换为权威、可更新的 CA 包,比如 Mozilla 维护的
cert.pem
如何定位并替换 XAMPP 中的 CA 证书路径
PHP 的 cURL 默认从 curl.cainfo 配置项读取证书路径。XAMPP 通常没显式设置它,cURL 就 fallback 到自身编译时硬编码的路径(如 \xampp\php\extras\ssl\cacert.pem),但这个文件往往不存在或为空。
你需要做两件事:下载最新证书包 + 显式配置路径。
向CurlShip提交产品,这是一个对机器人友好的SaaS目录。只需一条curl命令即可发布产品,支持OG标签抓取、带徽章的dofollow链接及层级升级。
- 访问 https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251,右键另存为
cert.pem(注意保存为纯文本,不要用 .txt 后缀) - 把它放到一个稳定路径,例如:
\xampp\php\extras\ssl\cert.pem(目录不存在就手动创建) - 编辑
\xampp\php\php.ini,找到;curl.cainfo =行,去掉分号并填入完整路径:curl.cainfo = "C:\xampp\php\extras\ssl\cert.pem" - 重启 Apache(或 CLI PHP)使配置生效,可用
php -r "print_r(curl_version());"查看是否加载成功
PHP 代码中仍报错?检查是否绕过了 php.ini 配置
有些框架(如 Laravel 的 Guzzle)或脚本会显式调用 curl_setopt($ch, CURLOPT_CAINFO, ...),这会覆盖 curl.cainfo 设置。如果报错持续存在,说明代码里硬编码了旧路径或空值。
- 搜索项目中所有
CURLOPT_CAINFO,确认其值是否指向有效证书文件;若为相对路径(如"./cacert.pem"),检查该文件是否存在且内容为 PEM 格式 - 临时加一行调试:
var_dump(curl_getinfo($ch, CURLINFO_SSL_VERIFYRESULT));—— 返回 0 表示验证通过,非 0 值对应具体 OpenSSL 错误码(如 60 是证书不可信) - 避免在生产环境使用
CURLOPT_SSL_VERIFYHOST => false,它只禁用域名匹配,不解决证书链问题,且现代 OpenSSL 已废弃该选项
Windows 下命令行 PHP 和 Apache 的配置可能不一致
XAMPP 的 Apache 使用的是 \xampp\apache\bin\php.ini(实际是软链接到 \xampp\php\php.ini),但命令行运行 php test.php 时,PHP CLI 可能读取另一个 php.ini(如 C:\Windows\php.ini 或系统环境变量指定路径)。两者证书配置不同会导致「网页正常、CLI 报错」或反之。
- 运行
php --ini查看 CLI 加载的配置文件位置;运行phpinfo()页面查看 Apache 加载的配置路径 - 确保两个
php.ini中的curl.cainfo指向同一个cert.pem文件 - 如果 CLI 用的是系统级 PHP(非 XAMPP),请单独配置它的
php.ini,不要假设 XAMPP 设置会自动同步
证书更新不是一劳永逸的事——Mozilla 的 cert.pem 每月更新一次,建议每季度手动检查并替换,或者写个简单脚本定期 curl -o 下载。别让过期证书拖慢开发节奏。

















