跳到主要内容

3. 用于 DTLS 的 SRTP 扩展

3. 用于 DTLS 的 SRTP 扩展

本节描述用于建立 SRTP 密钥材料, 算法和参数的 DTLS 扩展.

3.1 use_srtp 扩展

为了协商使用 SRTP 数据保护, 客户端会在 DTLS 扩展 client hello 中包含一个类型为 "use_srtp" 的扩展. 仅当正在传输的数据是 RTP 或 RTCP 时, 才必须使用此扩展. 此扩展的 "extension_data" 字段包含可接受的 SRTP protection profiles 列表. use_srtp 扩展还指示客户端将在 SRTP 数据包中使用的 MKI (Master Key Identifier), 或客户端为其接收的 SRTP 数据包使用的 MKI.

扩展格式如下:

uint8 SRTPProtectionProfile[2];

struct {
SRTPProtectionProfiles SRTPProtectionProfiles;
opaque srtp_mki<0..255>;
} UseSRTPData;

SRTPProtectionProfile SRTPProtectionProfiles<2..2^16-1>;

SRTPProtectionProfile 值在 Section 3.1 中定义. 如果服务器愿意接受 use_srtp 扩展, 它必须在 DTLS 扩展 server hello 中以自己的 use_srtp 扩展响应. 服务器的列表必须只包含一个 SRTPProtectionProfile 值, 且该值必须是客户端提供的值之一.

3.2 证书选择

DTLS 允许服务器发送 certificate_request 消息. 如果客户端没有合适的证书, 它必须发送一个空 certificate 消息作为响应. 使用 DTLS-SRTP 时, 客户端应该使用适合与 DTLS 配合使用的证书. 由于媒体路径上的 DTLS 不使用信令信道的安全上下文, DTLS 使用的证书应该不同于信令协议使用的任何证书.

3.3 密钥派生

使用 DTLS-SRTP 时, DTLS 充当 SRTP 的密钥派生函数 (key derivation function). TLS PRF 用于按如下方式派生所需的密钥材料:

keying material = PRF(master_secret, "EXTRACTOR-dtls_srtp",
client_random + server_random)

随后, 按照所选 SRTP protection profile 的定义, 将密钥材料拆分为两个方向 (客户端到服务器和服务器到客户端) 所需的 SRTP 加密密钥, 认证密钥和加盐密钥 (salting keys).

3.4 密钥作用域

每个 DTLS-SRTP 会话保护单个 RTP/RTCP 源. 只要所有媒体共享同一个 SSRC, 单个 DTLS-SRTP 会话就可用于保护两个端点之间同一方向上的多个 RTP 流或 RTCP 数据包. 但是, 当会议呼叫涉及多个源, 且每个源都有不同的 SSRC 时, 每个 SSRC 必须使用单独的 DTLS 会话.

3.5 密钥使用限制

从 DTLS 派生的密钥必须仅用于保护在同一个 5-tuple (源 IP, 源 UDP 端口, 目标 IP, 目标 UDP 端口和协议) 上传输的 RTP 和 RTCP 流量. 如果要在不同的 5-tuple 上发送流量, 必须执行新的 DTLS 握手.