7

バウンシーキャッスルTLSライブラリを使用して、ソケットを使用してサーバーとクライアントの間で通信したいと考えています。私は多くのドキュメントを調べましたが(私には不十分でした)、これを行う方法がわかりませんでした。

BouncyCastle v1.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 の使用方法は? 新しいクラスを宣言し、その中にメソッドを実装する必要がありますか?

この弾む城で私を助けてください。

編集 1: という抽象クラスから継承する 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 に答える