You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

DTLS:mbedTLS与OpenSSL密钥材料不一致问题咨询

可能的原因及排查方向

这种跨库(mbedTLS vs OpenSSL)的DTLS-SRTP密钥导出不一致问题,我之前帮朋友排查过类似的,大概率是下面几个细节没对齐导致的:

  • 标签(Label)参数不匹配
    SRTP密钥导出的核心要求之一是两边使用完全相同的导出标签。mbedTLS的mbedtls_ssl_export_srtp_keys函数内部已经默认使用了SRTP标准规定的标签"EXTRACTOR-dtls_srtp",但OpenSSL的SSL_export_keying_material需要你手动传入这个标签字符串。如果你在OpenSSL端传错了标签(比如大小写错误、多打了空格,或者用了旧的标签),两边导出的密钥材料必然不同。一定要确保OpenSSL端的label参数和mbedTLS内部使用的完全一致。

  • SRTP套件协商未对齐
    密钥导出的基础是DTLS握手时协商好的SRTP加密套件。如果mbedTLS客户端没有正确配置支持的SRTP套件(比如没调用mbedtls_ssl_conf_srtp_profiles设置对应套件),或者服务端OpenSSL的SRTP套件配置和客户端不重叠,握手时可能没有成功协商出SRTP参数,导致两边基于不同的基础密钥材料导出SRTP密钥。建议抓包检查DTLS握手的SRTP扩展字段,确认协商的套件是一致的。

  • 密钥导出的长度与字段顺序差异
    mbedTLS的mbedtls_ssl_export_srtp_keys会直接返回拼接好的SRTP密钥材料(通常顺序是:客户端发送密钥、服务端发送密钥、客户端发送盐、服务端发送盐),而OpenSSL的SSL_export_keying_material需要你指定总导出长度,并且自己拆分出各个字段。如果你在OpenSSL端指定的导出长度不对,或者拆分字段的顺序搞反了,就会导致最终使用的密钥/盐不匹配。可以把两边导出的密钥材料打印成十六进制,对比字节序列的差异,看看是长度不对还是顺序颠倒了。

  • DTLS版本或扩展配置差异
    DTLS 1.2和DTLS 1.3的密钥导出流程有差异,如果客户端和服务端使用的DTLS版本不一致,或者某一端启用了特殊的扩展(比如PSK、ECDHE参数不匹配),也会导致握手后的主密钥(Master Secret)不同,进而导致SRTP密钥导出不一致。要确认两边的DTLS版本、加密套件、扩展配置完全对齐。

  • mbedTLS的上下文初始化问题
    确保调用mbedtls_ssl_export_srtp_keys时使用的SSL上下文是已经完成DTLS握手的有效上下文,并且没有被重置或修改过。如果上下文状态异常(比如握手未完全完成,或者中途出错),导出的密钥材料也会不正确。


内容的提问来源于stack exchange,提问作者Nikita Vakhutin

火山引擎 最新活动