讲师中心 微信公众号

工具推荐

视频效率加速
AniShort
AniShort

AI短剧协同制作平台

updream

一键生成高质量推广成片

立刻MV
立刻MV

低成本歌曲 MV、视频生成

Seko
Seko

AI短剧一键生成成片

C++如何调用HTTPS接口并验证证书?(OpenSSL或libcurl配置)

胖芳小哥_1663

胖芳小哥_1663

发布时间:2026-02-20 09:27:02

|

669人浏览过

|

来源于php中文网

原创

默认libcurl仅验证证书链不验证主机名,必须同时设CURLOPT_SSL_VERIFYPEER=1L和CURLOPT_SSL_VERIFYHOST=2L才安全;指定CA证书首选CURLOPT_CAINFO绝对路径PEM文件,避免CAPATH;自签名证书应追加至CA bundle末尾,切勿关闭验证。

c++如何调用https接口并验证证书?(openssl或libcurl配置)

curl_easy_setopt 设置证书验证开关 默认情况下 libcurl 会校验服务器证书,但不校验主机名(即不检查 CN 或 SAN 是否匹配请求域名),这容易被中间人攻击绕过。必须显式开启主机名验证,否则看似“能通”,实则不安全。
  • 开启完整验证:curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L)(验证证书链)
  • 同时必须开:curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L)(验证主机名,2L 是唯一有效值,1L 已废弃且无效)
  • 如果跳过验证(仅调试用):CURLOPT_SSL_VERIFYPEER 和 CURLOPT_SSL_VERIFYHOST 都设为 0L,但上线前必须删掉

常见错误:只设 CURLOPT_SSL_VERIFYPEER 为 1L,却漏掉 CURLOPT_SSL_VERIFYHOST,结果证书链通过了,但连的是假域名(比如 DNS 劫持或 hosts 污染),程序毫无察觉。

指定 CA 证书路径的三种方式libcurl 默认不自带可信 CA 列表,不指定就会报 SSL certificate problem: unable to get local issuer certificate。
  • 最可靠:用 CURLOPT_CAINFO 指向 PEM 格式的单个 CA bundle 文件,例如:curl_easy_setopt(curl, CURLOPT_CAINFO, "/etc/ssl/certs/ca-bundle.crt")
  • Linux 系统常用路径有:/etc/ssl/certs/ca-certificates.crt(Debian/Ubuntu)、/etc/pki/tls/certs/ca-bundle.crt(RHEL/CentOS)
  • Windows 下需自行提供,推荐从 Mozilla 官方导出:curl -o ca-bundle.crt <a href="https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251">https://www.php.cn/link/5fe4dadcdb001d8566cd20e6d8a20251</a>
  • 不要用 CURLOPT_CAPATH(目录模式),它依赖 OpenSSL 的哈希命名规则,Windows 和某些嵌入式环境不兼容,容易静默失败

注意:CURLOPT_CAINFO 路径必须是绝对路径或确保当前工作目录稳定;相对路径在 daemon 进程或 IDE 启动时极易失效。

SSL Certificate Checker
SSL Certificate Checker

SSL/TLS 证书到期检查器和域名健康监控。检查证书到期、颁发者信息、SAN 条目及证书链有效性,适用于单个或多个域名。

下载

OpenSSL 底层证书加载失败的典型表现 即使 libcurl 参数全对,底层 OpenSSL 若找不到证书,仍会报错,现象包括:SSL connect error、error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed。
  • 检查 OpenSSL 版本是否太老(
  • 调用 SSL_get_error() 获取具体错误码,比只看 curl_easy_strerror() 更准
  • 在调用 curl_easy_perform() 前加一句:curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L),观察日志里是否出现 <em> ALPN, offering http/1.1</em> 和 Server certificate 区块,缺失说明握手根本没走到证书阶段
  • 若程序静态链接 OpenSSL,确保编译时用的头文件和运行时 .so/.dll 版本一致,混用会导致 SSL_CTX_load_verify_locations 返回 0 却无提示

自签名证书或内网 CA 的处理方式 生产环境绝不能关验证,但测试或私有服务需要适配非公网 CA。
  • 把内网根证书内容追加到你的 CA bundle 文件末尾(PEM 格式,以 -----BEGIN CERTIFICATE----- 开头),然后继续用 CURLOPT_CAINFO
  • 不要用 CURLOPT_SSL_CTX_FUNCTION 手动调 SSL_CTX_load_verify_locations,它绕过 libcurl 内部状态管理,多线程下易出竞态
  • 若证书带密码,libcurl 不支持自动解密,必须提前用 openssl pkcs12 -nodes 导出无密钥的 PEM,再合并进 CA bundle

真正麻烦的不是加证书,而是证书更新后忘记同步到所有部署节点——尤其是容器镜像里硬编码的 bundle 文件,一两年不更新就可能因根证书过期导致批量连接失败。

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
curl_exec
curl_exec

curl_exec函数是PHP cURL函数列表中的一种,它的功能是执行一个cURL会话。给大家总结了一下php curl_exec函数的一些用法实例,这个函数应该在初始化一个cURL会话并且全部的选项都被设置后被调用。他的返回值成功时返回TRUE, 或者在失败时返回FALSE。

3943

2023.06.14

linux常见下载安装工具
linux常见下载安装工具

linux常见下载安装工具有APT、YUM、DNF、Snapcraft、Flatpak、AppImage、Wget、Curl等。想了解更多linux常见下载安装工具相关内容,可以阅读本专题下面的文章。

955

2023.10.30

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1069

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3520

2023.10.25

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3248

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

5489

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3909

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

506

2026.01.19

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

40

2026.11.12

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 0.1万人学习

PHP使用CURL抓取页面
PHP使用CURL抓取页面

共4课时 | 3.1万人学习

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

共12课时 | 2.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn