7

我想使用 bouncy castle TLS 库使用套接字在服务器和客户端之间进行通信。我浏览了许多文档(这对我来说还不够),但我不知道如何做到这一点,

我正在使用BouncyCastle v1.7.48 (runtime version=v2.0.50727) 二进制文件,我找到了这些信息,

我必须使用Org.BouncyCastle.Crypto.Tls命名空间和TlsProtocolHandler类。

要实现 TLS 通信,

  1. 我应该在服务器端使用什么 API?
  2. 我应该在客户端使用什么 API?

        System.IO.Stream inputStream, outputStream;
        TlsProtocolHandler tls = new TlsProtocolHandler(inputStream, outputStream);
    
  3. 参数inputStreamoutputStream?

公共虚拟无效连接(TlsClient tlsClient);

其中,是TlsClient一个接口,其中包含许多接口

4. 如何使用上述API?我必须向所有人声明新类并在其中实现方法吗?

请帮我解决这个充气城堡。

编辑 1: 我创建了一个类,它继承自一个名为DefaultTlsClient. 然后我可以创建我的类的一个实例并将其传递给接口参考。所以我可以像这样发送参数。tls.Connect(tlsClient);

除了上面提到的之外,我没有初始化任何参数。(在 2055 上的这些操作之前连接了套接字)但是我不确定握手是否完成。我的程序将进入阅读状态。

4

1 回答 1

12

充气城堡中没有服务器端 TLS API。您可以在主页上阅读它们仅支持客户端。

对于客户端,您已经找到了正确的课程。TlsProtocolHandler可以完成这项工作,但是如果没有自定义类,它将无法工作。这是示例代码:

    // Need class with TlsClient in inheritance chain
    class MyTlsClient : DefaultTlsClient
    {
        public override TlsAuthentication GetAuthentication()
        {
            return new MyTlsAuthentication();
        }
    }

    // Need class to handle certificate auth
    class MyTlsAuthentication : TlsAuthentication
    {
        public TlsCredentials GetClientCredentials(CertificateRequest certificateRequest)
        {
            // return client certificate
            return null;
        }

        public void NotifyServerCertificate(Certificate serverCertificate)
        {
            // validate server certificate
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            TcpClient client = new TcpClient();

            client.Connect(IPAddress.Loopback, 6000);

            // input/output streams are deprecated, just pass client stream
            TlsProtocolHandler handler = new TlsProtocolHandler(client.GetStream());

            handler.Connect(new MyTlsClient());

            // handshake completed
            // use handler.Stream.Write/Read for sending app data

            Console.ReadLine();
        }
    }

我已经用我的 tcp 服务器对此进行了测试,并收到了客户端的问候。

请记住,它是 1.0 版中的 TLS,所以如果您需要其他版本或服务器 api,那么我建议使用其他库(.NET 框架支持 TLS)。

于 2013-05-29T13:54:12.823 回答