【问题标题】:How can I use an SSLStream without a TcpSocket如何在没有 TcpSocket 的情况下使用 SSLStream
【发布时间】:2017-12-02 22:23:20
【问题描述】:

我写了一个 TCP 库,现在想支持 SSL。该库将连接/断开连接部分与数据流的处理分开。我可以插入一个流处理程序,该处理程序将传输和接收字节块,但它无权访问提供该数据的套接字。

所有使用 SslStream 的例子看起来都差不多是这样的:

TcpClient client = new TcpClient();
Sslstream sslStream = new SslStream(client.GetStream(), true, ValidCerts);

我想在没有 TcpClient 提供流的情况下使用 SslStream。

有没有我可以做到这一点?

【问题讨论】:

  • 到底是什么问题?将您拥有的任何流放入SslStream 构造函数而不是client.GetStream。如果这不起作用 - 显示代码以及它到底是如何不起作用的(异常详细信息)。
  • 您对 SSL/TLS 的理解程度如何?你应该看看RFC 5246 了解网络活动需要什么。
  • 也许我想太多了,但我原以为你需要 2 个流(出口,入口),否则进来的字节会覆盖出去的字节。
  • 一个 NetworkStream 真的是两个流,因为写方法给你出口,读方法给你入口。在 Java 中,可比较的方法是 Socket.getInputStream()Socket.getOutputStream(),这使得区别可能更加清晰。

标签: c# sockets ssl


【解决方案1】:

例子可以改写为:

TcpClient client = new TcpClient();
Stream stream = client.GetStream();
...
SslStream ssl = new SslStream(stream, true, ValidCerts);

client.GetStream() 调用刚刚被内联; SslStream 仅与 Stream 交互,而不与 TcpClient 交互。

【讨论】:

  • 我不想使用 TcpClient 流,我想创建自己的流。
  • TcpClient.GetStream() 返回 NetworkStream,但您可以使用 any Stream 实现。
  • 如果我提供 MemoryStream 它似乎不起作用。你觉得应该吗?
  • 认证时,SslStream 可能会先将握手数据写入MemoryStream。您必须响应写入流的握手,但您没有时间准备流,因为它将立即开始尝试从相同的MemoryStream 读取,这将立即返回 0,这被视为关闭连接。
猜你喜欢
  • 2021-10-30
  • 2019-11-15
  • 2013-06-30
  • 2015-08-09
  • 2018-08-21
  • 2017-06-11
  • 2014-06-24
  • 2021-12-14
  • 2019-01-24
相关资源
最近更新 更多