极简 WebRTC 握手

💡 原文英文,约2700词,阅读约需10分钟。
📝

内容提要

文章探讨浏览器间WebRTC握手的最小体积。作者在Chromium 157和Safari 26.2上实测:完整SDP约568–587字节,精简SDP可降至279字节(SHA-256)或241字节(SHA-1)。若双方共享模板、仅传随机参数,可缩至55字节;若证书持久化并预置指纹,仅需23字节。但需已知局域网IP、共享SDP模板,且SHA-1不可用于生产。安全上须用SHA-256、认证信令、每设备独立证书。

🔎

延伸解读

23 字节的前提条件比数字本身更重要

文章测得的 23 字节握手并非无条件成立:双方需持有持久化证书并已缓存对端指纹,局域网 IP 由信令层提供,SDP 模板、mid、sctp-port、setup 和角色均共享或默认。ICE 凭据仍由浏览器每次连接随机生成,因此标准浏览器 API 无法降到零。读者应把 23 字节视为特定假设下的下限,而非通用方案。

精简 SDP 的可行边界与浏览器差异

实测表明 Chrome 与 Safari 都接受 m=application 9 DTLS/SCTP x 模板,并可省略 a=mid、a=setup、c= 和 a=group:BUNDLE。但 Safari 对 a=sctp-port 有额外限制:若包含该属性,m= 行必须写成 UDP/DTLS/SCTP webrtc-datachannel,否则解析报错。若追求保守兼容,保留 mid、sctp-port 和 setup 后约 348 字节,仍远小于完整 SDP。

安全取舍:SHA-1 与共享证书不可用于生产

文章明确警告 SHA-1 仅用于实验,它虽节省 12 字节二进制或 36 字节文本,却引入碰撞攻击风险,生产必须用 SHA-256。指纹是信任锚点,信令若未认证,攻击者可替换指纹实施 DTLS 中间人,因此需 WSS/HTTPS 或端到端签名。此外,不应在多设备间共享同一证书私钥,否则一台设备失陷即导致整体身份模型崩溃;合理做法是每设备独立证书并带外固定指纹。

IP 来源决定压缩上限,信令层是关键

浏览器通过 mDNS 隐藏本地 IP,网页无法关闭该特性。若载荷只传端口,接收方需从信令层获取对端 IP:局域网本地信令服务器可直接观察源地址,同机可用 127.0.0.1,TURN 中继则已知中继 IP、仅端口动态。若信令在云端,它看到的是公网 NAT 地址而非局域网 IP。因此“IP 已知、只传端口”的 55 字节方案依赖信令拓扑,并非纯 WebRTC 能力。

❓

Q&A

浏览器之间 WebRTC 握手最小能压缩到多少字节?

在特定假设下,每个方向可压缩到 23 字节。前提是双方使用持久化证书并预置对方指纹、已知局域网 IP、共享 SDP 模板,且 ICE 凭据仍由浏览器生成。

WebRTC 握手必须交换哪些信息?

必须交换 ICE 的 ufrag、pwd 和候选地址(IP+端口),DTLS 证书指纹和 setup 角色,以及 SCTP 端口和最大消息大小(可默认)。信令的 offer/answer 角色可由消息类型隐含。

为什么 WebRTC 握手不能直接硬编码证书?

标准 Web API 不允许导入证书:RTCCertificate 构造函数非法,generateCertificate 是唯一工厂,无法将 PEM 私钥交给 RTCPeerConnection。但可以生成一次证书后存入 IndexedDB 复用,实现每设备持久身份。

精简 SDP 时哪些字段可以删除?

可删除 a=mid、a=sctp-port、a=setup、a=group:BUNDLE、c=、a=ice-options:trickle、a=max-message-size、a=end-of-candidates 等,因为单 m-line 下浏览器有默认值或忽略它们。但保守跨浏览器建议保留 mid、sctp-port 和 setup。

使用 23 字节握手有哪些安全风险?

必须使用 SHA-256 而非 SHA-1;指纹是信任锚,信令必须认证(WSS/HTTPS 或端到端签名)以防 MITM;不要共享私钥,应每设备独立证书并预置指纹;保护证书存储并轮换。

Chrome 和 Safari 在最小 SDP 上有哪些差异?

Safari 的 host 候选默认是 .local,且 a=sctp-port 必须搭配 UDP/DTLS/SCTP webrtc-datachannel,否则解析错误;Chrome 可用测试标志关闭 mDNS 获得原始 IP。两者都接受相同的最小 m=application 9 DTLS/SCTP x 模板和 SHA-1 指纹(但不应使用)。

如果只知道端口,接收方如何获得对方 IP?

可由信令层观察源地址获得:局域网信令服务器或直接 TCP/WebSocket 连接的对端地址就是对方 LAN IP;同机用 127.0.0.1;也可发送 .local 候选让浏览器解析,或使用 STUN/TURN。

🏷️

标签

➡️

继续阅读