0

0

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

冰火之心

冰火之心

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

|

617人浏览过

|

来源于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_newSSL_newSSL_set_fdSSL_connectSSL_writeSSL_readSSL_shutdownSSL_freeclose

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

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

  • 容易踩的坑:开发机能通,部署到 Alpine 容器就报 SSL_ERROR_SSLX509_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。

PhotoG
PhotoG

PhotoG是全球首个内容营销端对端智能体

下载
  • 常见错误现象:GET 请求返回 HTML 但只拿到前半截,或者 POST 后卡在 SSL_read 不返回
  • 正确做法:用 SSL_pending 判断缓冲区是否还有未读数据;对 HTTP,先解析响应头(找 \r\n\r\n),再根据 Content-LengthTransfer-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工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

450

2023.08.07

json是什么
json是什么

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

546

2023.08.23

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

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

326

2023.10.13

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

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

81

2025.09.10

typedef和define区别
typedef和define区别

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

118

2023.09.26

define的用法
define的用法

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

360

2023.10.11

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

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

332

2023.10.17

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

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

773

2023.10.18

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

24

2026.02.28

热门下载

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

精品课程

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

共1课时 | 842人学习

C# 教程
C# 教程

共94课时 | 10.5万人学习

C 教程
C 教程

共75课时 | 5.1万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号