带有System.IO.Pipelines的TLS / SSL

时间:2018-12-12 21:13:26

标签: c# ssl .net-core tls1.2

我注意到了新的System.IO.Pipelines,并试图将现有的基于流的代码移植到其上。流的问题已广为人知,但同时它还具有丰富的相关类回显系统。

在此处提供的示例中,有一个小型的tcp echo服务器。 https://blogs.msdn.microsoft.com/dotnet/2018/07/09/system-io-pipelines-high-performance-io-in-net/

此处附有代码段:

    var options = {
        pages: @Html.Raw(Json.Encode(ViewBag.Array)) ,
        singlePageMode: true
    };

    options.pages = options.pages.map(function(url){
       return { src: url };
    });

    $("#pdfbox").flipBook(options);

使用流时,只需将SSL / TLS包装在SslStream中,就可以轻松地将SSL / TLS添加到代码中。如何通过管道解决这个问题?

1 个答案:

答案 0 :(得分:3)

命名管道是一种网络协议,就像HTTP,FTP和SMTP一样。让我们来看一下.net Framework的一些快速示例:

  • HTTP连接会自动利用SSL, 取决于基本URI。如果URI带有“ HTTPS:”,则SSL为 用过的。
  • 通过设置 在调用GetResponse()之前,将EnableSsl属性设置为true。
  • SMTP与FTP使用SSL的方式相同。

但是,如果我们使用其他网络协议(例如管道)怎么办?马上,我们知道没有什么类似于“ HTTPS”前缀。此外,我们可以阅读System.IO.Piplines的文档,并看到没有“ EnableSsl”方法。但是,在.NET Framework和.NET Core中,都可以使用SslStream类。此类允许您从几乎所有可用的Stream中构建SslStream。

System.IO.Pipes命名空间也可以在.NET Framework和.NET Core中使用。 Pipes名称空间中可用的类非常有用。

  • AnonymousPipeClientStream
  • AnonymousPipeServerStream
  • NamedPipeClientStream
  • NamedPipeServerStream
  • PipeStream

所有这些类都返回某种从Stream继承的对象,因此可以在SslStream的构造函数中使用。

这与System.IO.Piplines命名空间有什么关系?好吧...不是。 System.IO.Pipelines命名空间中定义的类,结构或接口都不从Stream继承。因此,我们不能直接使用SslStream类。

相反,我们可以访问PipeReaders和PipeWriters。有时我们只能使用其中之一,但是考虑使用双向管道,以便我们可以同时访问这两个管道。

System.IO.Piplines命名空间有助于提供IDuplexPipe接口。如果我们要将PipeReader和PipeWriters包装在SSL流中,则需要定义一个实现IDuplexPipe的新类型。

在这种新类型中:

  • 我们将定义一个SslStream。
  • 我们将使用通用管道作为输入和输出缓冲区。
  • PipeReader将使用输入缓冲区的读取器。我们将使用此输入缓冲区从SSL流中获​​取数据。
  • PipeWriter将使用输出缓冲区的编写器。我们将使用此输出缓冲区将数据发送到SSL流。

这是一个伪代码示例:

SslStreamDuplexPipe : IDuplexPipe
{ 
    SslStream sslStream;
    Pipe inputBuffer;
    Pipe outputBuffer;

    public PipeReader Input = inputBuffer.Reader;
    public PipeWriter Output = outputBuffer.Writer;

    ReadDataFromSslStream()
    {
        int bytes = sslStream.Read(new byte[2048], 0, 2048);
        inputBuffer.Writer.Advance(bytes)
        inputBuffer.Writer.Flush();
    }

    //and the reverse to write to the SslStream 
 }

如您所见,我们仍在使用System.Net.Security命名空间中的SslStream类,这仅花了我们几个步骤。

这是否意味着您基本上仍在使用流?是的但是,一旦完全实现了SslStreamDuplexPipe类,就只能使用管道。无需将SslStream包裹在所有内容上。

马克·格雷韦尔(Marc Gravell)为此写了很多很多详细的解释。这三个部分中的第一个可以在这里找到:https://blog.marcgravell.com/2018/07/pipe-dreams-part-1.html

此外,您还可以阅读提到的各种.NET类: