【问题标题】:Adding encryption to a server built with SocketAsyncEventArgs向使用 SocketAsyncEventArgs 构建的服务器添加加密
【发布时间】:2019-01-16 07:05:59
【问题描述】:

我看了很多次,很惊讶地发现完全没有可以回答这个问题:

如何在使用 SocketAsyncEventArgs 时实现 SSL/TLS(或类似的)加密?我确实读到了一个可以理论上使用 SslStream 和“作弊" 通过创建一个中间人来协调进出流的数据,进出套接字。这一切看起来都很荒谬......

我查看了 BouncyCastle,但他们似乎不支持服务器端加密。诚然,此信息的来源已有近 10 年的历史,但我自己的研究却一无所获。

我对更改我的服务器架构不感兴趣,所以请不要告诉我“我真的不需要SocketAsyncEVentArgs 的性能,应该只更改为TcpListener”。

我对使用 SocketAsyncEventArgs 在客户端和服务器之间实现可靠加密的任何方法感兴趣。

【问题讨论】:

    标签: c# sockets ssl encryption tls1.2


    【解决方案1】:

    没有将 SAEA 附加到加密的直接方法。它们不共享一个 API,所以一切都是桥梁。

    最简单的方法是 - 如您所知 - SslStream,但是:这通常与 SocketAsyncEventArgs 不兼容。还有其他选择——例如,我可以想到至少 3 种不同的方式来使用“管道”来做到这一点;但所有这些都将是 naked SAEA 的重大架构变化。所以如果SAEA和SslStream的差别太大,SAEA和IDuplexPipe的差别就更大了。但是,“管道”设计是为了实现高可扩展性能,所以...也许它仍然适合您的口味?我最近在博客上写了很多关于管道的文章很多,如果有帮助的话;另外,我有客户端/服务器代码的 github 示例,包括一个 250 万+ ops/秒的类似 redis 的服务器。

    【讨论】:

    • 我会看看你关于管道的博客。我已经开始研究关于 TLS 1.2 的 RFC 规范,虽然不是微不足道的,但我认为使用像 BouncyCastle 之类的库来执行(非常)低级的事情可能会很有用。
    • @MatthewGoulart 你可能还想问 Tim Seaward 是否“Leto”会支持它; “Leto”是“OpenSSL 遇到管道”
    • @MatthewGoulart 当然可以;第 3 部分有更多实用的动手代码,对实际使用更有用;但是在开始之前要考虑的重点:你仍然需要一个 TLS 部件;选项 1) 中间的 SslStream(我使用的是 NetworkStream=>SslStream=>pipelines); 2)“莱托”(蒂姆的东西); 3) “Kestrel”有一个 TLS 包装器;上次我问大卫福勒这个问题时,他暗示它对于套接字模式还不是很完美,但是:他们正在努力
    • 感谢您提供的信息。我将看看所有三个选项。在阅读了几段之后,您的博客似乎将是我接下来几个晚上的晚间阅读。
    猜你喜欢
    • 1970-01-01
    • 2011-06-27
    • 2013-06-28
    • 2010-12-05
    • 2010-11-30
    • 2013-09-12
    • 2018-05-28
    • 1970-01-01
    • 2011-07-17
    相关资源
    最近更新 更多