You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为TLS v1.2配置重新协商指示扩展?含三场景处理

实现TLS 1.2专属的Renegotiation Indication Extension

核心思路

TLS 1.3已废弃重新协商机制,只需在协商使用TLS 1.2时发送该扩展。借助OpenSSL的自定义扩展回调,可动态适配所有场景。

具体实现

1. 注册自定义扩展回调

通过SSL_CTX_set_client_custom_ext注册回调函数,在握手过程中判断当前TLS版本,决定是否发送扩展:

// 扩展发送回调:仅TLS 1.2客户端模式下发送Renegotiation Indication Extension
static int reneg_ext_add(SSL *s, unsigned int ext_type, unsigned int *out_len,
                        unsigned char **out, X509 *cert, int server) {
    // 仅客户端场景,且协商版本为TLS 1.2时发送
    if (!server && SSL_get_protocol_version(s) == TLS1_2_VERSION) {
        // 空的renegotiation_info内容(长度0),表示支持安全重新协商
        *out_len = 0;
        *out = OPENSSL_malloc(0);
        return 1;
    }
    return 0; // 其他情况不发送
}

// 将回调绑定到SSL_CTX
SSL_CTX_set_client_custom_ext(ctx, TLSEXT_TYPE_renegotiation_info,
                             reneg_ext_add, NULL, NULL, NULL);

2. 适配三种场景

  • 场景1(仅支持TLS 1.2):回调始终触发,正常发送扩展,满足需求。
  • 场景2(仅支持TLS 1.3):回调判断版本为TLS 1.3,自动跳过发送,符合TLS 1.3规范。
  • 场景3(同时支持TLS 1.2/1.3):握手时动态判断协商版本,TLS 1.2时发送、TLS 1.3时不发送,完美适配混合场景。

关键注意事项

  • 扩展类型固定为TLSEXT_TYPE_renegotiation_info,空内容(长度0)代表客户端支持安全重新协商。
  • 一套代码覆盖所有场景,无需针对不同版本单独配置。
  • 确保使用OpenSSL 1.0.1及以上版本,该版本开始支持SSL_CTX_set_client_custom_ext接口。

内容的提问来源于stack exchange,提问作者Jack J

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 13:34:59