带套接字tcp的C#ssl / tls

时间:2016-09-03 07:54:44

标签: c# ssl tcp

我是C#开发的新手。我试图在tcp上使用ssl / tls,但在我的代码中,使用system.net.sockets.socket(裸套接字)而不是tcpclient或tcplistner。我已经在网上搜索了至少200个链接,但我没有得到任何相关内容。我想使用较少的编码并通过tcp套接字连接完成ssl或tsll。我有客户端,服务器,ca证书,密钥为.key格式。请帮助举例或链接。如果你有更多细节,你可以提问。

2 个答案:

答案 0 :(得分:7)

为什么不想TcpClient?使用TcpClientSsltream创建SSL连接非常简单。除非您需要数千个同时连接,否则我会坚持使用TcpClientSSLStream

基本TcpClientSslStream示例如下:

static void Main(string[] args)
{
    string server = "127.0.0.1";
    TcpClient client = new TcpClient(server, 443);

    using (SslStream sslStream = new SslStream(client.GetStream(), false,
        new RemoteCertificateValidationCallback(ValidateServerCertificate), null))
    {
        sslStream.AuthenticateAsClient(server);
        // This is where you read and send data
    }
    client.Close();
}

public static bool ValidateServerCertificate(object sender, X509Certificate certificate,
X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    return true;
}

高性能套接字代码很难用.NET编写,但有很好的例子。你有很多选择。我不确定一个解决方案是否适合所有人,所以我在这里列出一些。

  1. 使用[Asynchronous Client Socket]可能是一个好的起点
  2. 您可以使用一些现有的库。我已经使用了Nitro/Async但是我不认为自2009年以来它已经更新。有人谈到版本2,但我不相信它已经实现。
  3. 我不熟悉它,但CodeProject有C# SocketAsyncEventArgs High Performance Socket Code
  4. 查看Microsoft的指南High Performance .NET Socket Server Using Async Winsock
  5. 阅读Stephen Toub所说的一切,包括Awaiting Socket Operations
  6. 我没有专门解决SSL,而是查看SslStream类。

    您还需要查看缓冲池。如果您为数千个客户服务,垃圾收集将是一个问题。对此的一个很好的介绍是Sunny Ahuwanya's Blog

    http://nitoasync.codeplex.com/

    之前。

答案 1 :(得分:0)

您应该可以使用System.Net.Sockets.NetworkStream来包装套接字,然后使用System.Net.Security.SslStream来包装网络流。

Socket socket;
Stream networkStream = new NetworkStream(socket);
Stream sslStream = new SslStream(networkStream);