通过HAProxy在Client Hello中携带MSISDN时出现SSL握手错误(BAD RECORD MAC)
问题背景
我正在开发一款移动应用,客户端通过蜂窝网络向5G核心网发起令牌生成请求。5G核心网在将请求转发至HAProxy前,会在Client Hello消息的扩展字段中添加手机号码(MSISDN)。服务器已确认收到包含该手机号码的Client Hello消息,但SSL握手过程中出现错误:
事件序列
- 服务器收到带MSISDN扩展的Client Hello消息
- 服务器向客户端发送Hello消息及证书
- 移动客户端通过5GC向HAProxy发送客户端密钥后,HAProxy抛出SSL握手错误
错误信息(PCAP记录)
级别:2 致命
描述:BAD RECORD MAC
已完成的排查步骤
- 在Nginx中使用相同配置测试,出现相同错误
- 更换SSL证书,错误仍存在
- 禁用5G核心网添加MSISDN至Client Hello扩展的任务后,SSL握手错误消失
- 启用5G核心网但不添加MSISDN扩展时,错误也不会出现
问题解答
1. 添加MSISDN扩展导致BAD RECORD MAC错误的原因
BAD RECORD MAC错误本质是SSL/TLS记录的消息认证码(MAC)校验失败,说明客户端发送的后续握手消息(这里指客户端密钥相关内容)的完整性被破坏,服务器计算出的MAC值和消息携带的MAC值不匹配。
结合排查结果,问题根源在5G核心网对Client Hello的修改:
- SSL/TLS握手的Client Hello消息本身带有MAC校验,用于保证消息完整性。5G核心网直接修改扩展字段后,没有重新计算并更新对应的MAC值
- 客户端是基于原始未修改的Client Hello生成密钥材料和MAC,而服务器是基于被修改后的Client Hello计算,两边握手上下文完全不一致,最终导致后续消息的MAC校验失败
2. HAProxy或SSL/TLS是否有特定配置解决该问题
目前HAProxy和标准SSL/TLS栈没有现成配置能绕过这种MAC校验失败——因为MAC校验是SSL/TLS安全机制的核心,目的就是防止消息被篡改,强行绕过会破坏整个加密通信的安全性。
如果必须保留5G核心网添加MSISDN的逻辑,不能靠调整HAProxy/SSL配置解决,必须从5G核心网的修改逻辑入手。
3. 禁用5G核心网相关任务可避免错误的原因
当5G核心网不修改Client Hello消息时,客户端和服务器端基于完全一致的原始握手上下文生成密钥材料、计算MAC,所有握手消息的完整性校验都能通过,自然不会触发BAD RECORD MAC错误。
解决建议
- 修复5G核心网的消息修改逻辑:要求5G核心网在修改Client Hello的扩展字段后,重新计算并更新整个握手消息的MAC值,确保修改后的消息符合SSL/TLS的完整性要求
- 更换MSISDN传递方式:如果5G核心网无法正确处理SSL/TLS消息的MAC重计算,改用其他合规方式传递MSISDN:
- SSL握手完成后,通过HTTP请求头传递MSISDN字段
- 利用5GC原生的用户面/控制面通道传递用户标识,而非直接修改SSL握手消息
- 验证扩展编码合规性:检查5G核心网添加的MSISDN扩展是否符合SSL/TLS自定义扩展的编码规范,错误的编码格式也可能间接导致握手上下文不一致
内容的提问来源于stack exchange,提问作者Paras Jani
相关产品推荐
相关产品推荐

