如何修复 Windows 上的 PHP Curl HTTPS 证书颁发机构问题

成功的 HTTPS 请求涉及 HTTP 客户端验证 服务器根据已知且受信任的根列表提供的 TLS 证书 证书。 PHP Curl 扩展没有什么不同;卷曲 扩展使用 libcurl 发出 HTTPS 请求,而 libcurl 又使用 OpenSSL 等 TLS 库来验证请求。

图片.png

Curl 扩展需要一个包含以下内容的有效文件:所有的 受信任的根证书来完成HTTPS验证,以及PHP 将其公开为 php.ini 文件中的指令。

在 Linux、BSD 和 macOS 上,libcurl 可以默认为系统根目录 证书,但这在 Windows 上是不可能的,因为 Windows 确实 不附带包含所有系统根目录的单个文件 证书。

本文讨论了使用 Curl 扩展成功发出 HTTPS 请求的两种可能方法,以及不采取哪些措施可能导致 HTTPS 请求不安全。

失败原因

$ch = curl_init('https://php.watch');  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  curl_exec($ch); // false  curl_error($ch);// SSL certificate problem: unable to get local issuer certificate

如果curl_exec调用失败并返回错误响应,并且如果curl_error指示SSL证书问题:无法获取本地颁发者证书错误,这意味着Curl未提供包含根证书的文件,或者无法发现它。

此错误在 Linux、BSD 和 macOS 系统上并不常见,但相当多 Windows上常见,因为没有指定文件获取root 证书,并且 PHP 不在其上提供根证书列表

解决方案是提供一个包含最新根目录的文件 证书,或者理想情况下,让 Curl 解析本地根存储 底层操作系统提供。

使用本机证书颁发机构

在 Curl 7.71 及更高版本上,可以设置 Curl 请求 Curl 使用本机(系统)根证书的选项。 这甚至在 Windows 上也有效,其中 Curl 解析系统根证书 并使用它们。

当 CURLOPT_SSL_OPTIONS 选项设置为 CURLSSLOPT_NATIVE_CA 时 或包含这些位的位掩码,Curl 尝试使用本机 根证书存储,取决于证书的功能和版本 底层 TLS 库。

如果 Curl 扩展是使用 Curl 7.71 或更高版本以及 PHP 8.2 及更高版本构建的,这是建议的修复。

 $ch = curl_init('https://php.watch');  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);   curl_setopt($ch, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA);    curl_exec($ch);

请注意,上面的代码片段不会检查Curl 版本和 PHP 版本,并假设满足 PHP 和 Curl 版本要求。这 以下是有条件地添加 Curl 选项的示例:

$ch = curl_init('https://php.watch');  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  if (defined('CURLSSLOPT_NATIVE_CA')    && version_compare(curl_version()['version'], '7.71', '>=')) {      curl_setopt($ch, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA);}  curl_exec($ch);

下载并维护 cacert.pem 文件

对于在 8.2 之前的 PHP 版本上运行的应用程序(其中 CURLSSLOPT_NATIVE_CA 常量不可用),或者当 Curl 版本低于 7.71 时, 推荐的替代解决方案是下载 Curl 兼容的 根证书文件,并配置 PHP 或 Curl 请求来使用它。

Curl 项目维护着最新的证书列表。请参阅从 Mozilla 提取的 CA 证书。

立即学习“PHP免费学习笔记(深入)”;

下载 cacert.pem 文件

将文件移动到 PHP 和 Web 服务器可访问的目录。例如,C:/php/cacert.pem。

编辑 php.ini 文件并修改curl.cainfo 条目以指向 cacert.pem 文件的绝对路径。

[curl]; A default value for the CURLOPT_CAINFO option. This is required to be an; absolute path.;curl.cainfo =curl.cainfo = "C:/php/cacert.pem"

(可选)重新启动 Web 服务器(例如Apache)重新加载 INI 文件。

这种方法的缺点是 cacert.pem 文件必须定期更新。 cacert.pem 例如,Curl 项目提供的文件是从根目录中提取的 由 Mozilla 维护的商店。平均而言,此列表和文件得到 每年更新4-5次。确保与最新root兼容 证书列表,请确保更新此文件的本地副本 定期

如果无法修改 INI 文件,请在 Curl 请求中指定 cacert.pem 文件的绝对路径:

 $ch = curl_init('https://php.watch'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CAINFO, 'C:/php/cacert.pem'); curl_exec($ch);

在 PHP 8.2 和 Curl 7.77 上,可以使用 CURLOPT_CAINFO_BLOB 选项获取包含 cacert.pem 内容的字符串。

以上就是如何修复 Windows 上的 PHP Curl HTTPS 证书颁发机构问题的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1249662.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月9日 21:34:05
下一篇 2025年12月8日 05:25:48

相关推荐

  • php怎么去掉多余的标签

    本文针对 PHP 开发人员提供了一种高效的方法来移除不必要的 HTML 标签。通过利用内置的 DOMDocument 类和相应的 XPath 表达式,你可以轻松识别和删除多余的元素,从而优化你的 HTML 代码库,提升网页的性能和加载速度。 1. 确定要删除的标签 1.1 手动检查 检查 HTML …

    2025年12月9日
    000
  • 如何从 PHP 文本输入中查找字符串

    我们可以使用两种不同的方法以编程方式从大型文本输入字符串中定位和检索内容。 我们可以 1) 逐字搜索文本输入(相当于在文档或浏览器中使用“CTRL F”搜索),或者我们可以 2) 通过正则表达式搜索文本表达式。 使用 下面提供的代码示例,我们可以轻松利用两个 分别执行两种搜索方法的免费 API。我们…

    2025年12月9日
    000
  • 在 Laravel 应用程序中集成第三方 API 的分步指南

    主题:laravel、api、thirdpartyintegration、web 开发 php laraveltips apisinlaravel 将第三方 api 集成到 laravel 中可以通过利用外部服务(例如支付、数据检索等)来增强您的应用程序。以下是有效集成第三方 api 的分步指南和示…

    2025年12月9日
    000
  • 要避免的 fetch() 和 XMLHttp 错误

    可悲的是,我没有避免这些错误。我希望这可以帮助其他人在尝试更新网页而不完全下载新版本时避免它们。我最终得到的代码似乎有效: async function fetchdbsingle(url, str) { const datatosend = str; console.log(‘fetchdbsin…

    2025年12月9日
    000
  • 创建专注的领域应用程序 Symfony 方法(保存实体)

    介绍 在本系列的第三篇文章中,我们将创建一个准备好从我们在本系列第一篇文章中创建的 dto 持久保存到数据库的实体。 将 userinputdto 转换为实体 从本节开始,我们假设我们正在使用原则与数据库进行通信,并且我们的 user 实体如下所示: #[ormentity(repositorycl…

    2025年12月9日
    000
  • 如何提高 php 水平

    提高 php 水平需要持续学习。对于成长中的 php 开发人员来说,这是一个关键阶段。以下是提高 php 技能的基本步骤: 从基础开始 专家总是建议从核心概念开始,例如变量、数据类型和控制结构。这是提高 PHP 编码技能最重要的学习路径。 创建您的工作空间 首先,创建您的开发环境作为您的创作空间。通…

    2025年12月9日
    000
  • 初学者提高编程逻辑的 5 个技巧

    编程方法的5个步骤是什么?如何才能擅长编程逻辑?编程逻辑的基础是什么?初学者应该如何开始编程? 想要找到这些问题的答案吗?请继续阅读。 计算机系统中的一组规则,也称为编程逻辑,指定了某些组件的放置顺序,以使计算机硬件能够执行特定任务。换句话说,编程逻辑是以系统的方式应用规则来产生可行的结果。 编程逻…

    2025年12月9日
    100
  • php怎么编写代码

    编写 PHP 代码的指南:设置开发环境:安装 PHP 解析器、Web 服务器和文本编辑器/IDE。创建 PHP 文件:使用文本编辑器创建扩展名为 “.php” 的文件。编写代码:使用 语法编写 PHP 代码。运行代码:保存 PHP 文件,在 Web 服务器中打开,并在浏览器中…

    2025年12月9日
    000
  • php中常用的预定义常量函数是什么

    PHP 提供预定义常量函数来获取有关 PHP 环境和服务器的信息,如下:FILE:获取当前脚本的文件绝对路径。LINE:获取当前执行行的行号。DIR:获取当前脚本目录的绝对路径。PHP_VERSION:获取 PHP 的当前版本。PHP_OS:获取 PHP 运行所在操作系统名称。PHP_EOL:获取当…

    2025年12月9日
    000
  • 如何在 Laravel 中包含 JavaScript 适用于所有场景的分步指南

    如何在 laravel 11 中包含 javascript:适用于所有场景的分步指南 在 laravel 11 中,向项目添加 javascript 变得轻而易举,这要归功于默认的资源捆绑器 vite。以下是如何为各种场景设置 javascript,从全局包含到特定视图中的条件加载。 1. 在所有文…

    2025年12月9日
    000
  • 如何用php代码建表

    如何在 PHP 中使用 MySQL 创建表?连接到 MySQL 数据库。编写 CREATE TABLE 语句,指定新表及其列的结构。使用 mysqli_query() 函数执行 CREATE TABLE 语句。 如何在 PHP 中使用 MySQL 创建表 在 PHP 中使用 MySQL 创建表,需要…

    2025年12月9日
    000
  • 如何搭建nginx php

    搭建 Nginx + PHP 服务器共需要 6 个步骤:1. 安装 Nginx;2. 安装 PHP;3. 安装 PHP-FPM Nginx 模块;4. 配置 Nginx,创建配置文件并设置监听端口、服务器名称、根目录、文件查找顺序等;5. 配置 PHP,调整 PHP-FPM 池设置,包括监听端口、用…

    2025年12月9日
    000
  • 如何访问本地php文件

    可以通过以下三种方法访问本地 PHP 文件:Web 服务器:使用 Apache 或 Nginx 等 Web 服务器,将 PHP 文件移动到服务器的文档根目录,并在 Web 浏览器中输入文件路径。PHP 命令行界面 (CLI):安装 PHP CLI,并在命令提示符或终端窗口中使用 php 命令执行 P…

    2025年12月9日
    000
  • php中不允许使用关键字来为变量命名吗

    PHP不允许使用关键字作为变量名,因为关键字是预先定义的保留字,用于特定语法目的,如abstract、case、const、default等。而魔法方法__call()和__get()允许在特殊情况下使用关键字,但对于常规变量命名,建议避免使用关键字,以防止编译时错误和潜在冲突。 PHP中允许使用关…

    2025年12月9日
    000
  • 前端和企业 PHP 开发者,哪个 IDE 更适合你?

    php ide 比较 对于偏向于前端和企业发展的 PHP 开发人员,这里推荐几个好用且专业的 IDE 选项: PHPStorm PHPStorm 是 JetBrains 开发的一款强大的 PHP IDE,深受开发人员的喜爱。它提供了许多高级功能,包括: 智能代码完成代码重构和重构版本控制集成调试和性…

    2025年12月9日
    000
  • New in EasyAdmin: Pretty URLs

    easyadmin 最受欢迎的功能刚刚在 4.14.0 版本中推出。 从第一天开始,easyadmin 就使用查询字符串参数来传递必要的渲染后端页面的信息。这种方法创建的 url 如下: https://example.com/admin?crudaction=edit&crudcontro…

    2025年12月9日
    100
  • 如何学习 PHP

    PHP 是一种编程语言,具有相对简单但通用的语法,使其成为初学者的一个很好的起点。然而,您可能仍然对第一次实现 PHP 代码的想法感到不知所措。还好,有很多 您可以用来学习 PHP 的免费资源。无论您是否观看过一些 YouTube 教程或参加在线课程,您可以快速熟悉 使用这种流行的编程语言。 在这篇…

    2025年12月9日
    300
  • 如何在 PHP CodeIgniter 中生成 Pdf sing *dompdf*

    第 1 步:创建数据库表在 mysql 数据库中创建用户表: create table users ( id int auto_increment primary key, name varchar(50) not null, surname varchar(50) not null, email …

    2025年12月9日
    000
  • Lithe Crypt:简化 PHP 应用程序中的加密

    lithe crypt 是一个简单的 php 加密和解密实用程序,旨在与 lithe 框架配合使用。它利用 aes-256-cbc 算法进行安全数据处理。 安装 要安装 lithe crypt 软件包,您可以使用 composer。如果您尚未安装,请确保 composer 在您的系统上可用。然后在项…

    2025年12月9日
    000
  • Lithe Hash:用于安全密码哈希的强大模块

    lithe hash 是一个强大的模块,设计用于使用 bcrypt 算法安全地散列密码。该模块简化了创建、验证和管理密码哈希的过程,确保遵循安全最佳实践。 目录 安装用法导入类创建哈希验证哈希检查哈希是否需要重新哈希了解 bcrypt处理异常测试许可证 安装 要安装 lithemod/hash 包,…

    2025年12月9日
    000

发表回复

登录后才能评论
关注微信