Использование API TLS Bouncy Castle

Я хочу общаться между сервером и клиентом с помощью сокетов, используя библиотеку TLS bouncy castle. Я прошел через много документации (что было недостаточно для меня), но я понятия не имел, как это сделать,

я использую после установки BouncyCastle В1.7.48(версия выполнения=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. каковы параметры inputStream и outputStream?

public virtual void Connect(TlsClient tlsClient);

здесь TlsClient это интерфейс и содержит много интерфейсы внутри.

4. Как использовать вышеуказанный API? Я должен объявить новые классы и реализовать методы внутри этого для всех?

пожалуйста, помогите мне с этим надувным замком.

EDIT 1: Я создал один класс, который наследуется от абстрактного класса DefaultTlsClient. Затем я мог бы создать экземпляр моего класса и передать его для ссылки на интерфейс. Поэтому я мог бы отправить параметр следующим образом. tls.Connect(tlsClient);

Я не инициализирую никаких параметров, кроме упомянутых выше. (Розетки подключаются перед этой операцией на 2055) Но я не уверен, что рукопожатие завершено. Моя программа перейдет в состояние чтения.

1 ответов


в bouncy castle нет серверного 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-сервером и получил привет клиента.

имейте в виду, что это TLS в версии 1.0, поэтому, если вам нужна другая версия или серверный api, я рекомендую использовать другие библиотека (.NET framework поддерживает TLS).