如何为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
相关产品推荐
相关产品推荐

