0

0

C++怎么调用OpenSSL_C++加密通信教程【安全】

冰火之心

冰火之心

发布时间:2026-02-26 15:10:01

|

628人浏览过

|

来源于php中文网

原创

openssl c++调用前必须确认三件事:一是安装openssl 1.1.1或3.0+并正确链接-lssl -lcrypto;二是全局调用openssl_init_ssl()初始化;三是使用tls_client_method()而非已弃用的sslv23_client_method()。

c++怎么调用openssl_c++加密通信教程【安全】

OpenSSL C++ 调用前必须确认的三件事

直接上手写 SSL_connect() 前,先停一下:你大概率会卡在链接、证书或上下文初始化这三处。C++ 本身不提供 SSL 封装,所有调用都是对 OpenSSL C API 的裸用,没有 RAII 自动清理,也没有异常安全保证。

  • 确认已安装的是 OpenSSL 1.1.1 或 3.0+(openssl version -a),旧版(如 1.0.2)已停止维护,且 API 行为差异大
  • 编译时必须显式链接 -lssl -lcrypto,且顺序不能颠倒——-lcrypto 必须在 -lssl 后面,否则大量未定义符号(如 SSL_newBIO_new_ssl_connect
  • 全局初始化只做一次:OPENSSL_init_ssl(OPENSSL_INIT_SSL_DEFAULT, nullptr)(1.1.1+),不是 SSL_library_init();漏掉会导致后续所有 SSL_CTX_new() 返回 nullptr

SSL\_CTX\_new() 失败的常见原因和绕过方式

SSL_CTX_new() 返回 nullptr 是最常遇到的“黑屏”问题,不是代码写错了,而是环境或配置没对齐。

  • 错误现象:SSL_CTX_new(TLS_client_method()) 返回空,但 ERR_get_error() 没报错——大概率是 OpenSSL 初始化失败或线程不安全调用(多线程下未设置 CRYPTO_set_locking_callback
  • 开发阶段可临时绕过证书验证(仅限测试):SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, nullptr);但生产环境必须设为 SSL_VERIFY_PEER 并加载 CA 证书(SSL_CTX_load_verify_locations(ctx, "ca-bundle.crt", nullptr)
  • 不要用 SSLv23_client_method()——它已被弃用,在 OpenSSL 3.0+ 中直接返回 nullptr;统一改用 TLS_client_method()

SSL\_read() 和 SSL\_write() 的阻塞与重试逻辑

这两个函数不是“发完就完”,它们可能返回 -1 并非出错,而是需要你主动检查 SSL_get_error() 判断是否该等 I/O —— 这是 C++ 网络层最容易写崩的地方。

Warp
Warp

新一代的终端工具(内置AI命令搜索)

下载
  • SSL_write() 返回 -1 时,若 SSL_get_error(ssl, ret) == SSL_ERROR_WANT_WRITE,说明底层 socket 发送缓冲区满,需等待 socket 可写(例如用 select() 或 epoll_wait)再重试,不是立刻报错退出
  • SSL_read() 返回 -1SSL_get_error() == SSL_ERROR_WANT_READ,同理要等 socket 可读;若返回 0,表示对端关闭连接(clean shutdown),不是错误
  • 永远不要假设一次 SSL_write() 能把整个 buffer 发完——它可能只写入部分字节,返回值就是实际写入长度,需循环处理剩余数据

RAII 封装 SSL\_CTX 和 SSL 对象的最小安全模式

裸用 SSL_CTX_free()SSL_free() 极易内存泄漏或 double-free,尤其在异常路径中。必须手动加 RAII,但不用重造轮子。

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

  • std::unique_ptr 配合自定义 deleter:
    auto ctx_deleter = [](SSL_CTX* p) { if (p) SSL_CTX_free(p); };  
    std::unique_ptr<SSL_CTX, decltype(ctx_deleter)> ctx{SSL_CTX_new(TLS_client_method()), ctx_deleter};
  • SSL* 同理,但注意:一个 SSL* 必须绑定到唯一 socket fd,且 SSL_set_fd() 只能调用一次;重复调用不会报错,但后续 I/O 行为不可预测
  • 别用 std::shared_ptr 管理 SSL*——SSL 对象内部有引用计数(SSL_up_ref()),但外部共享指针会干扰其生命周期,导致提前释放或悬垂指针

真正难的不是调通第一个 HTTPS 请求,而是让 SSL 对象在各种异常分支(DNS 失败、connect 超时、证书校验失败、网络中断)下都能被正确释放且不崩溃。每个 SSL_* 函数调用后,都得想清楚:如果下一行 throw 了,这个资源还在不在?

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

294

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

105

2025.10.23

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

721

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

371

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

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

27

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

25

2026.01.21

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

100

2026.02.06

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2720

2024.08.16

Golang 实际项目案例:从需求到上线
Golang 实际项目案例:从需求到上线

《Golang 实际项目案例:从需求到上线》以真实业务场景为主线,完整覆盖需求分析、架构设计、模块拆分、编码实现、性能优化与部署上线全过程,强调工程规范与实践决策,帮助开发者打通从技术实现到系统交付的关键路径,提升独立完成 Go 项目的综合能力。

1

2026.02.26

热门下载

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

精品课程

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

共1课时 | 837人学习

C# 教程
C# 教程

共94课时 | 10.3万人学习

C 教程
C 教程

共75课时 | 5万人学习

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

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