如何在 XAMPP 环境中解决 cURL 证书过期导致的报错问题

风萱君_2184

风萱君_2184

2026-04-08

1018人浏览

原创

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

如何在 xampp 环境中解决 curl 证书过期导致的报错问题

为什么 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 Directory Submission
CurlShip Directory Submission

向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 下载。别让过期证书拖慢开发节奏。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

12184

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

6961

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2215

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

4428

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

5154

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

4051

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

5857

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

4582

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

12422

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP使用CURL抓取页面
PHP使用CURL抓取页面

共4课时 | 3.1万人学习

前端最全HTTP基础原理及应用
前端最全HTTP基础原理及应用

共12课时 | 2.1万人学习