【问题标题】:C# ssl/tls with socket tcp带有套接字 tcp 的 C# ssl/tls
【发布时间】:2017-01-11 06:58:49
【问题描述】:

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

【问题讨论】:

    标签: c# ssl tcp


    【解决方案1】:

    你为什么不想使用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. 您可以使用一些现有的库。我用过Nito/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

    我没有专门解决 SSL,而是查看 SslStream 类。

    您还需要研究缓冲池。如果您为成千上万的客户提供服务,那么垃圾收集将是一个问题。一个很好的介绍是Sunny Ahuwanya's Blog


    https://github.com/StephenCleary/AsyncEx

    之前。

    【讨论】:

    • 在这个回复中付出了很多努力,但遗憾的是,这根本没有回答这个问题。
    【解决方案2】:

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

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

    【讨论】:

    • 这个答案看起来很简单。只是一个疑问:这是否意味着我们这样包裹socket之后,我们不应该使用socket.send(),而应该始终使用sslStream?我问是因为我已经有一个使用 Begin/End 进行发送/接收的异步套接字的工作项目,它工作正常。使用 SSL 仅计划作为应用程序中的一个选项,因此我试图弄清楚我需要做多少更改才能实现它。任何帮助将不胜感激。非常感谢。
    • 绝对可以,只使用ssl流,否则对方无法正确读取数据
    • 您可以使用它来同意密钥,然后在您的连接上使用 AES。创建并加密您的字节,然后像往常一样发送它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 2020-02-27
    • 2015-05-20
    • 1970-01-01
    相关资源
    最近更新 更多