参考文章:详解 WebRTC 传输安全机制:一文读懂 DTLS 协议 - 知乎
一 DTLS:udp上的tls,传输音视频用的,用的libsrtp库。
SRTP:rtp头没有加密,payload加密了。
a=setup:active:作为DTLS客户端,主动发起协商,即client hello。
a=setup:passive:作为DTLS服务端,等待协商。
a=setup:actpass:由对端决定,谁active,谁passive。
客户端的sdp是a=setup:actpass,sdp type是offer。
服务器janus的sdp是a=setup:passive,sdp type是answer,音视频一样。
客户端先发Client Hello,作为DTLS Client,主动发送协商。
二 SRTP的密钥怎么算?跟类型、Server的pubkey、Client的pubkey有关。
Server Hello中重要的字段:Cipher Suite、use_srtp的类型。
//material就是srtp密钥? SSL_export_keying_material(dtls->ssl, material, master_length*2, "EXTRACTOR-dtls_srtp", 19, NULL, 0, 0) srtp_crypto_policy_set_aes_cm_128_hmac_sha1_80(&(dtls->remote_policy.rtp)); memcpy(dtls->remote_policy.key, remote_key, key_length); memcpy(dtls->remote_policy.key + key_length, remote_salt, salt_length); srtp_create(&(dtls->srtp_in), &(dtls->remote_policy));//libsrtp主要函数: srtp_err_status_t res = srtp_create(&srtp_ctx->ctx, policy); //加密:把音视频数据拷贝到sbuf srtp_protect(rtp_forward->srtp_ctx->ctx, &rtp_forward->srtp_ctx->sbuf, &protected); srtp_unprotect(pc->dtls->srtp_in, buf, &buflen);//解密三 ICE:Nat穿透相关。
NAT:把内网IP转换成公网IP+端口。
ICE是一个框架,整合了STUN和TRUN。分tcp和udp、host、replay。
TRUN:在STUN上,加了中继功能,即转发功能。
janus用的libnice库,mediasoup自己实现的。
sdp的ice-ufrag、ice-pwd。
nice_agent_set_remote_credentials(handle->agent, handle->stream_id,ruser,rpass)。
fingerprint判断是否相等。一个是sdp带的,
另一个是:DTLS握手中的Certificate的x.509证书。本地计算出证书的SHA256 fingerprint,再比较。
四 顺序
1 信令交换sdp、
2ICE连通检测-stun包—bind request、response、绑定ip和port。
3 在ICE已打通的udp端口进行DTLS握手:Client Hello、Server Hello等、
4 srtp包--使用绑定ip和port。