如何在加密有效负载前面添加未加密的成帧标头(使用 Sslstream)
本文关键字:加密 使用 Sslstream 有效 负载 前面 添加 | 更新日期: 2023-09-27 18:36:20
我正忙于使用 C# 和 .NET Framework 4.5 实现 ICE-TCP (RFC 6544 https://www.rfc-editor.org/rfc/rfc6544)。但是,我面临着一个与协议分层相关的非常棘手的问题,如下所示。
ICE-TCP RFC 说:
"ICE要求代理对STUN和应用层流量进行多路复用,因为它们出现在同一个端口上。 这种解复用在 [RFC5245] 中有描述,并使用魔术 cookie 和消息的其他字段完成.
面向流的传输引入了另一个问题,因为它们需要一种方法来构建连接,以便可以提取应用程序和 STUN 数据包,以便将 STUN 数据包与应用层流量区分开来><。出于这个原因,利用ICE的TCP媒体流使用RFC 4571(https://www.rfc-editor.org/rfc/rfc4571#section-2)中提供的基本成帧,即使应用层协议不是RTP。
取景方法如下所示:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
---------------------------------------------------------------
| LENGTH | RTP or RTCP packet ... |
---------------------------------------------------------------
我还想在我的实现中使用TLS,ICE-TCPRFC说:
"当使用传输层安全性(TLS)或数据报传输层安全性(DTLS)时,它们也在RFC 4571成帧垫片上运行,而STUN在(D)TLS连接之外运行。 生成的 ICE TCP 协议栈如图 1 所示,左侧为 (D)TLS,右侧没有 TLS。
最后,ICE TCP堆栈如下所示:
+----------+
| |
| App |
+----------+----------+ +----------+----------+
| | | | | |
| STUN | (D)TLS | | STUN | App |
+----------+----------+ +----------+----------+
| | | |
| RFC 4571 | | RFC 4571 |
+---------------------+ +---------------------+
| | | |
| TCP | | TCP |
+---------------------+ +---------------------+
| | | |
| IP | | IP |
+---------------------+ +---------------------+
所以我对图的左侧很感兴趣。该图暗示成帧标头在 TLS 加密之外,我必须将未加密的标头写入流。
目前,我的应用程序使用环绕在NetworkStream周围的SslStream类,这是我从TCPClient获得的。我的第一个意图是将成帧标头写入 NetworkStream,然后将加密的应用程序数据写入 SslStream。经过一番研究,我发现:
"在AuthenticateAsClient/Server之后,您的连接将受到SSL保护。不要调用 Socket 或 NetworkStream 方法:这会破坏 SslStream。来源:C# 套接字和 SslStreams
因此,一旦建立SSL连接,我就无法写入NetworkStream。
我的问题是:有没有办法在TCP(NetworkStream)和TLS(SslStream)之间"放置"标头?
提前谢谢。
此致敬意
马库斯
SslStream
实例在NetworkStream
实例之上分层。您写入 SSL 流的任何数据都由 SSL 流处理,然后 SSL 流将其生成的任何数据写入NetworkStream
实例。
如果保留对NetworkStream
的引用,则可以根据需要直接读取或写入NetworkStream
,绕过 SSL 流。
只要保持直接写入NetworkStream
的任何内容不被连接两端的SslStream
读取,SslStream
将继续正常运行。
实际上,您将在单个流中多路复用两个字节流。其中一个字节流将是SSL流,另一个将是您的其他流。只要连接的两端都知道何时在两个流之间切换,你应该没问题。