
mbedtls TLS 1.2 与 TLS 1.3 共存实战完整配置与版本协商避坑【免费下载链接】mbedtlsAn open source, portable, easy to use, readable and flexible TLS library, and reference implementation of the PSA Cryptography API. Releases are on a varying cadence, typically around 3 - 6 months between releases.项目地址: https://gitcode.com/GitHub_Trending/mb/mbedtls网关同时接新旧客户端老设备只会 TLS 1.2新设备走 TLS 1.3。mbedtls 里两者共存只差两行版本 API 加三个配置宏。下面按可直接抄的步骤讲配置方法含真实踩坑。最小可用配置mbedtls 同时启用 TLS1.2 和 TLS1.3先拿到代码如果还没有git clone https://gitcode.com/GitHub_Trending/mb/mbedtls版本控制只靠两个 API。去掉 init、free、错误处理这些样板后真正决定能谈哪几个版本的就是这几行mbedtls_ssl_config_defaults(conf, MBEDTLS_SSL_IS_SERVER, MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT); mbedtls_ssl_conf_min_tls_version(conf, MBEDTLS_SSL_VERSION_TLS1_2); mbedtls_ssl_conf_max_tls_version(conf, MBEDTLS_SSL_VERSION_TLS1_3);min/max_tls_version划出允许区间 [TLS 1.2, TLS 1.3]双方取交集能谈 1.3 就谈 1.3谈不拢退回 1.2。编译开关在include/mbedtls/mbedtls_config.h三个都要在位#define MBEDTLS_SSL_PROTO_TLS1_2 #define MBEDTLS_SSL_PROTO_TLS1_3 #define MBEDTLS_PSA_CRYPTO_C /* TLS 1.3 的硬依赖 */少前两个对应版本根本编不进库少了 PSAlibrary/mbedtls_check_config.h会直接拦住 1.3。⚠️ 注意4.0 起mbedtls_ssl_conf_min_version()那套 major/minor 老 API 已经移除网上很多旧教程的MBEDTLS_SSL_MINOR_VERSION_4写法会直接编译报错别照抄。底层怎么跑的版本协商ClientHello 里的 version list白话TLS 1.3 客户端发 ClientHello 时头部legacy_version固定写 0x0303假装自己是 1.2真实版本藏在supported_versions扩展里0x0304 才是 1.3。library/ssl_client.c里决定往 ClientHello 塞哪些版本unsigned char propose_tls12 (handshake-min_tls_version MBEDTLS_SSL_VERSION_TLS1_2) (MBEDTLS_SSL_VERSION_TLS1_2 ssl-tls_version); unsigned char propose_tls13 (handshake-min_tls_version MBEDTLS_SSL_VERSION_TLS1_3);两个 flag 都由你上面设的 min/max 算出来所以配置错了协商列表直接就是空的。配置开关 → 运行时行为映射多版本 TLS 配置方法⚙️ 配置宏和运行时行为不是 1:1最容易翻车的是开了 1.3 却没钥匙交换模式配置宏关闭时打开时MBEDTLS_SSL_PROTO_TLS1_21.2 套件不编译谈不了 1.2TLS 1.2 握手可用MBEDTLS_SSL_PROTO_TLS1_31.3 套件不编译TLS 1.3 握手可用MBEDTLS_PSA_CRYPTO_C配置检查直接拦截 1.31.3 前置条件MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_*无 1.3 套件0-RTT 也没戏对应密钥交换模式的套件生效MBEDTLS_SSL_EARLY_DATA早期数据一律拒绝0-RTT 可用握手分支tls_version 决定走哪条路白话服务端从 ClientHello 解出版本后ssl-tls_version就是一个枚举后面整条握手链路都靠它分叉。library/ssl_tls13_server.c解supported_versions时tls_version mbedtls_ssl_read_version(p, ssl-conf-transport); if (MBEDTLS_SSL_VERSION_TLS1_3 tls_version) { /* 走 TLS 1.3 握手表 */ } else if (MBEDTLS_SSL_VERSION_TLS1_2 tls_version) { /* 走 TLS 1.2 握手表 */ }之后library/ssl_tls.c里加解密、重协商、会话恢复全部switch (ssl-tls_version)1.2 和 1.3 各走各的library/ssl_tls12_client.c、library/ssl_tls13_client.c实现。踩坑记录mbedtls TLS 版本协商失败排查 3 个真实姿势排查前先做一件事打开调试日志mbedtls_ssl_conf_debug所有问题在日志里都有对应关键字。坑现象原因解法 排查关键字连接直接被拒对端报MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE-0x7280对端只说 1.3本端MBEDTLS_SSL_SSL_PROTO_TLS1_3没开或 min/max 区间和对端无交集双方区间必须重叠日志 grephandshake failed期望 1.3 却谈到 1.2mbedtls_ssl_get_version()返回 0x0303min/max 配反或三个KEY_EXCHANGE_MODE全关服务端没有 1.3 套件可给确认 min ≤ max至少开一个密钥交换模式grepselected ciphersuite看服务端选了什么0-RTT 反而更慢首包延迟 完整握手 早期数据重传MBEDTLS_SSL_EARLY_DATA没开早期数据被拒后客户端只能重发打开 early data 并配 PSK 模式grepearly data看拒绝日志补充两个高频细节TLS 1.3 客户端的legacy_version永远是 0x0303。用 Wireshark 看到握手在 1.2别下结论要抓supported_versions扩展。会话恢复时版本跟着 session 走1.3 的 ticket 拿去做 1.2 恢复会被拒绝反序列化路径在library/ssl_tls.c的mbedtls_ssl_session_load混版本集群要按版本分池存 ticket。生产环境 Checklist同时定义MBEDTLS_SSL_PROTO_TLS1_2和MBEDTLS_SSL_PROTO_TLS1_3→ 默认都在别误删保持MBEDTLS_PSA_CRYPTO_C开启 → 1.3 硬依赖min 设MBEDTLS_SSL_VERSION_TLS1_2、max 设MBEDTLS_SSL_VERSION_TLS1_3→ 新旧客户端都兜住至少启用一个MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_*→ 没交换模式就没有 1.3 套件需要 0-RTT 时开MBEDTLS_SSL_EARLY_DATA PSK 模式 → 否则 early data 必被拒mbedtls_ssl_conf_authmode用MBEDTLS_SSL_VERIFY_REQUIRED→ 防中间人开启mbedtls_ssl_conf_debug并保留日志 → 协商失败一眼定位回归跑tests/suites/test_suite_ssl→ 版本协商有现成用例兜底更多 1.3 握手细节看仓库里的docs/architecture/tls13-support.md版本组合的脚本化测试在tests/opt-testcases/下直接照着跑即可。【免费下载链接】mbedtlsAn open source, portable, easy to use, readable and flexible TLS library, and reference implementation of the PSA Cryptography API. Releases are on a varying cadence, typically around 3 - 6 months between releases.项目地址: https://gitcode.com/GitHub_Trending/mb/mbedtls创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考