如何在加密有效负载前面添加未加密的成帧标头(使用 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)

SslStream 实例在NetworkStream实例之上分层。您写入 SSL 流的任何数据都由 SSL 流处理,然后 SSL 流将其生成的任何数据写入NetworkStream实例。

如果保留对NetworkStream的引用,则可以根据需要直接读取或写入NetworkStream,绕过 SSL 流。

只要保持直接写入NetworkStream的任何内容不被连接两端的SslStream读取,SslStream将继续正常运行。

实际上,您将在单个流中多路复用两个字节流。其中一个字节流将是SSL流,另一个将是您的其他流。只要连接的两端都知道何时在两个流之间切换,你应该没问题。