c++ tls 1.3编程 c++如何使用openssl实现tls 1.3

夜丽酱_3315

夜丽酱_3315

2026-03-24

920人浏览

原创

openssl 1.1.1+ 是强制要求,需验证版本日期晚于2018-09-11且支持tls 1.3密码套件;必须显式调用ssl_ctx_set_min_proto_version(ctx, tls1_3_version)和max同设,否则仍可能降级至tls 1.2。

c++ tls 1.3编程 c++如何使用openssl实现tls 1.3

OpenSSL 1.1.1+ 是硬性门槛

不支持 TLS 1.3 的 OpenSSL 版本(比如 1.0.2 或 1.1.0)会直接忽略 TLSv1_3_method(),甚至编译时报 undefined reference。必须用 OpenSSL 1.1.1 或更新版本(如 3.0.x),且编译时不能禁用 TLS 1.3(默认开启,但某些发行版打包可能关掉)。

验证方法:openssl version -a 看输出是否含 built on 日期晚于 2018-09-11,再跑 openssl ciphers -s -tls1_3 确认有输出(如 TLS_AES_256_GCM_SHA384)。

  • 静态链接时,确保 libssl.a 和 libcrypto.a 来自同一 OpenSSL 1.1.1+ 构建
  • 动态链接时,LD_LIBRARY_PATH 要指向新版库路径,避免系统旧版 libssl.so.1.1 干扰
  • macOS 上用 Homebrew 安装的 OpenSSL 默认不替换系统库,需显式指定 -I/opt/homebrew/include -L/opt/homebrew/lib

SSL_CTX_set_min_proto_version() 必须显式设为 TLS1_3_VERSION

即使调用 TLSv1_3_method(),OpenSSL 默认仍允许降级到 TLS 1.2 —— 这不是 bug,是兼容性设计。要真正强制只用 TLS 1.3,必须关闭低版本协议:

SSL_CTX* ctx = SSL_CTX_new(TLSv1_3_method());
SSL_CTX_set_min_proto_version(ctx, TLS1_3_VERSION);
SSL_CTX_set_max_proto_version(ctx, TLS1_3_VERSION);
  • 漏设 set_min_proto_version 是最常见错误:握手时对方仍可能协商 TLS 1.2,你以为用了 1.3,其实没用
  • TLSv1_3_client_method() 和 TLSv1_3_server_method() 已废弃,统一用 TLSv1_3_method() + 显式版本控制
  • 服务端若需兼容老客户端,可设 min = TLS1_2_VERSION,但此时无法保证每次都是 TLS 1.3

证书和密钥加载失败会导致 TLS 1.3 握手静默失败

TLS 1.3 对证书链校验更严格,且部分旧证书(如 SHA-1 签名、RSA 密钥长度 SSL_accept(),而是在 SSL_do_handshake() 返回 -1 后,需查 SSL_get_error() + ERR_print_errors_fp() 才能看到 error:1417B07B:SSL routines:tls_process_cert_verify:bad signature 这类信息。

C++14
C++14

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

下载
  • 服务端必须加载完整证书链(包括中间 CA),单个 cert.pem 文件不够
  • 私钥格式必须是 PEM 且未加密(或已用 SSL_CTX_use_PrivateKey_file() 解密),PKCS#8 格式需确认 OpenSSL 版本支持
  • 客户端验证服务端证书时,若用 SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, nullptr) 却没调 SSL_CTX_load_verify_locations() 加载 CA 证书,TLS 1.3 握手会直接失败,不像 TLS 1.2 可能容忍

ALPN 协商失败不会阻止 TLS 1.3 建立,但影响上层协议

TLS 1.3 的 ALPN(Application-Layer Protocol Negotiation)是可选扩展,不影响加密通道建立。但如果业务依赖 HTTP/2 或自定义协议,ALPN 协商失败会导致后续通信异常,而错误日志里看不到 TLS 层报错。

服务端设置示例:

const char* protocols[] = {"h2", "http/1.1"};
SSL_CTX_set_alpn_protos(ctx, reinterpret_cast<const unsigned char>(protocols), 7); // 7 = strlen("h2") + strlen("http/1.1") + 2
</const>
  • 客户端和服务端 ALPN 列表无交集时,SSL_get0_alpn_selected() 返回空,但握手成功 —— 很容易误判为“连通了”
  • OpenSSL 3.0+ 中 SSL_set_alpn_protos() 参数类型改为 const unsigned char*,长度需手动算,传错会崩溃
  • HTTP/2 要求 TLS 1.3 + ALPN + 加密套件支持 ECDHE,三者缺一不可;只开 TLS 1.3 不代表能跑 h2

真正难调的不是握手本身,而是当 SSL_do_handshake() 返回 1 之后,你得立刻检查 ALPN 结果、证书有效性、密钥交换参数(如 SSL_get_shared_ciphers() 是否含 TLS_AES_256_GCM_SHA384),这些点全靠手动验证,OpenSSL 不主动告诉你哪步“看似成功实则无效”。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
scripterror怎么解决
scripterror怎么解决

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

2023.10.18

949

5

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

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

2023.10.25

2780

5

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2118

7

undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

2023.07.31

11705

4

网页undefined是什么意思
网页undefined是什么意思

网页undefined是指页面出现了未知错误的意思,提示undefined一般是在开发网站的时候定义不正确或是转换不正确,或是找不到定义才会提示undefined未定义这个错误。想了解更多的相关内容,可以阅读本专题下面的文章。

2024.08.14

5507

7

网页undefined啥意思
网页undefined啥意思

本专题整合了undefined相关内容,阅读下面的文章了解更多详细内容。后续继续更新。

2025.12.25

2516

7

macOS怎么切换用户账户
macOS怎么切换用户账户

在 macOS 系统中,可通过多种方式切换用户账户。如点击苹果图标选择 “系统偏好设置”,打开 “用户与群组” 进行切换;或启用快速用户切换功能,通过菜单栏或控制中心的账户名称切换;还能使用快捷键 “Control+Command+Q” 锁定屏幕后切换。

2025.05.09

4364

14

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.09

3323

4

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

2023.11.14

854

3

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习