我有一个服务器,它接收来自web浏览器的WebRTC会话的OFFER、ANSWER、CANDIDATE-s信息,并传递给它的对等服务器。随后,数据也从同一服务器传递。
现在为了实现我们自己的类似SFU的机制,我正在考虑是否可以
将这些数据解密为实际的原始字节,然后用他们自己的加密把它传递给多个对等点。为此,我考虑使用开源libsrtp库。这是它的示例代码。
它主要有两个功能,srtp_protect()
用于加密,srtp_unprotect()
用于解密。
问题:如何在上面的WebRTC SDP头(即offer, answer, candidate
)的联合中使用这样的库来获取原始的WebRTC字节并再次加密它们?
注意:其他开源解决方案,如"MediaSoup“、"Janus”等,不在本文讨论范围之内。
发布于 2022-02-09 15:35:40
如果您有报价、答案和候选人,您有足够的信息来建立一个WebRTC会话。在您担心加密/解密之前,您需要建立冰连通性
对于ICE,你需要每个代理,用户片段和密码。您可以通过提供/回答来交换这些值。我会从冰岩开始。您需要接受STUN请求数据包,断言用户片段是正确的,并使用密码签名。然后,使用用户片段响应眩晕响应,并使用密码签名。发送通信量的IP/端口是远程对等端。
对于C/C++,我建议使用柠檬汁或利布尼斯。这也是你可以自己写的东西!如果这是有帮助的话,我很乐意在我的回答中添加更多的细节。
接下来,您需要建立一个DTLS会话。你需要了解双方的角色。在“报价/应答”中,每一方将声明客户端的setup:active
、服务器的setup:passive
或setup:actpass
(如果将选择推迟到另一方)。当你知道细节,是时候开始握手了。
有关进行DTLS握手、提取键控材料等的示例,请参见dtls.c。重要的部分是正确设置您的角色,并设置读/写BIOs。由于OpenSSL无法发送ICE,所以您需要自己将数据输入/输出到OpenSSL中。还要确保您在报价/答案中验证证书指纹!
完成后,您可以通过这个DTLS连接发送SCTP(DataChannels)。
如果您想要执行SRTP,您需要出口关键材料,然后确定使用了什么密码套件。
如果有帮助的话,我很乐意添加更多的例子/更具体地谈论某些API。
发布于 2022-02-08 06:55:55
WebRTC使用DTLS,因此SRTP密钥是从先于SRTP数据包的DTLS握手派生出来的。
用于此的主要openssl (或boringssl) API是SSL_CTX_set_tlsext_use_srtp
、SSL_set_info_callback
和SSL_export_keying_material
,它们导出SRTP密钥(在对libsrtps srtp_create
的调用中使用)
在一起使用这些API的例子非常罕见,如果允许您查看它们的代码许可证,Janus和MediaSoup都是如何使用它们的很好的例子。
https://stackoverflow.com/questions/71028698
复制相似问题