讲师中心 微信公众号
AI工具推荐 视频效率加速

C++怎么调用OpenSSL_C++HTTPS请求加密通信【安全】

落枫同学_2223

落枫同学_2223

发布时间:2026-03-02 04:59:11

|

757人浏览过

|

来源于php中文网

原创

OpenSSL C++ HTTPS请求需手动管理完整连接生命周期:从SSL_CTX_new到close,顺序不可乱;证书验证默认关闭,须显式配置verify_mode和CA路径;SSL_read/SSL_write需循环处理;OpenSSL 3.0+ API变化大,需适配初始化与方法调用。

c++怎么调用openssl_c++https请求加密通信【安全】

OpenSSL C++ HTTPS 请求必须自己管理连接生命周期

OpenSSL 本身不提供“发个 URL 就返回 JSON”的高层封装,SSL_connect 之前得先 connect TCP,之后还得手动读写 SSL_read/SSL_write,最后要 SSL_shutdown + SSL_free + close。漏掉任意一环,轻则内存泄漏,重则 SSL 握手卡死或服务端复位连接。

  • 常见错误现象:SSL_read 返回 0(对方关闭)但没调 SSL_shutdown,下次复用 SSL* 会失败;SSL_free 后还调 SSL_get1_peer_certificate 导致段错误
  • 典型场景:需要控制超时、证书校验策略、SNI 主机名、ALPN 协议协商(如 h2)的定制化 HTTPS 客户端
  • 关键步骤顺序不能乱:SSL_CTX_new → SSL_new → SSL_set_fd → SSL_connect → SSL_write → SSL_read → SSL_shutdown → SSL_free → close

证书验证不是默认开启的,必须显式设置 verify_mode 和 CA 路径

默认情况下 SSL_CTX_set_verify 的 mode 是 SSL_VERIFY_NONE,即完全跳过证书链校验 —— 这等于裸奔 HTTPS。即使你调了 SSL_CTX_load_verify_locations 加载了 CA,不改 verify_mode 也没用。

  • 容易踩的坑:开发机能通,部署到 Alpine 容器就报 SSL_ERROR_SSL 或 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY,本质是容器里没 CA 证书或路径不对
  • 推荐做法:SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, nullptr),再配 SSL_CTX_set_verify_depth(ctx, 4)
  • CA 路径差异:/etc/ssl/certs/ca-certificates.crt(Debian/Ubuntu),/etc/pki/tls/certs/ca-bundle.crt(RHEL/CentOS),Alpine 用 /etc/ssl/certs/ca-certificates.crt 但需确保 apk add ca-certificates

SSL_read/SSL_write 不保证一次读完响应体,必须循环处理

HTTP 响应头和响应体混在同一个 SSL 流里,SSL_read 可能只返回几十字节(比如刚收到状态行),也可能一次返回整个响应(如果小)。直接假设“读一次就完”会截断 body 或阻塞在下一次 read。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 常见错误现象:GET 请求返回 HTML 但只拿到前半截,或者 POST 后卡在 SSL_read 不返回
  • 正确做法:用 SSL_pending 判断缓冲区是否还有未读数据;对 HTTP,先解析响应头(找 \r\n\r\n),再根据 Content-Length 或 Transfer-Encoding: chunked 决定怎么收 body
  • 性能影响:频繁小 read/write 会放大 syscall 开销,可考虑用 SSL_set_mode(ctx, SSL_MODE_ENABLE_PARTIAL_WRITE) 配合应用层缓冲

OpenSSL 1.1.1+ 和 3.0+ 的 API 差异会影响编译和行为

OpenSSL 3.0 弃用了大量低层函数,比如 SSLv23_client_method 已被移除,必须用 SSL_CTX_new(TLS_client_method());OPENSSL_init_ssl 初始化方式也变了。混合使用旧代码和新头文件会导致链接失败或运行时崩溃。

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

  • 错误信息示例:undefined reference to 'SSLv23_client_method'(3.0+)、'OPENSSL_init_ssl' was not declared in this scope(忘了加 #define OPENSSL_API_COMPAT 30000)
  • 兼容建议:CMake 中用 find_package(OpenSSL REQUIRED) 后检查 ${OPENSSL_VERSION},分支处理初始化逻辑;避免硬编码 SSL_library_init()(1.1.1 已废弃)
  • 安全影响:OpenSSL 1.1.1 将于 2023 年底停止支持,3.0+ 强制要求 provider 模型,FIPS 模式启用方式完全不同

真正难的不是连上 HTTPS,而是把证书验证、协议降级防护(禁用 TLS 1.0/1.1)、SNI、ALPN、session 复用、错误码映射这些细节全串起来还不漏内存 —— 每个点单独看简单,合在一起就是状态机地狱。

热门AI工具

更多
切问学术

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

DeepSeek

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

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

UpDream
UpDream Hot

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

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

豆包大模型

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

WorkBuddy

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

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2135

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3242

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1096

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

3699

2025.09.10

typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

313

2023.09.26

define的用法
define的用法

define用法:1、定义常量;2、定义函数宏:3、定义条件编译;4、定义多行宏。更多关于define的用法的内容,大家可以阅读本专题下的文章。

619

2023.10.11

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

580

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

876

2023.10.18

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

60

2026.10.16

热门下载

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

精品课程

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

共1课时 | 0.1万人学习

C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

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

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