4

TCPソケットを使用して通信するクライアントおよびサーバーアプリを作成したいと思います。ただし、ユーザーは他のユーザーが誰であるかを気にしないため、証明書は必要ありません。しかし、誰も詮索できないように、非対称暗号化が必要です。RSA を使用せずに対称キーを共有する方法は思いつきませんが、とにかく TCP で SSL を使用する必要があると思いますか?

C# で SSL/TCP 接続を作成する最も一般的な方法は何ですか? 私は、証明書を指定しないか、フライの1つを動的に作成するかのいずれかだと思います(ただし、それらは使い捨てにする必要があります...)。それを実装する最も簡単な方法は何ですか?sslstream を tcp ストリームに単純に追加しようとしましたが、それではうまくいきません (ストリームが読み取れないというエラーが発生します)。これまでのところ、私の簡単なコードは次のとおりです

    {
        Thread serverThread = new Thread((ThreadStart)delegate
        {
            TcpListener listener = new TcpListener(1234);
            listener.Start();
            using (TcpClient client = listener.AcceptTcpClient())
            //using (var sslstream = client.GetStream())
            using (var sslstream = new System.Net.Security.SslStream(client.GetStream(), true))
            using (StreamReader reader = new StreamReader(sslstream))
            using (StreamWriter writer = new StreamWriter(sslstream))
            {
                writer.AutoFlush = true;
                string inputLine;
                while ((inputLine = reader.ReadLine()) != null)
                {
                    writer.WriteLine(inputLine);
                }
            }
        });
        serverThread.Start();
        {
            string[] linesToSend = new string[] { "foo", "bar", "ack" };
            using (TcpClient client = new TcpClient("127.0.0.1", 1234))
            //using (var sslstream = client.GetStream())
            using (var sslstream = new System.Net.Security.SslStream(client.GetStream(), true))
            using (StreamReader reader = new StreamReader(sslstream))
            using (StreamWriter writer = new StreamWriter(sslstream))
            {
                writer.AutoFlush = true;
                foreach (string lineToSend in linesToSend)
                {
                    Console.WriteLine("Sending to server: {0}", lineToSend);
                    writer.WriteLine(lineToSend);
                    string lineWeRead = reader.ReadLine();
                    Console.WriteLine("Received from server: {0}", lineWeRead);
                    //Thread.Sleep(2000); // just for effect
                }
                Console.WriteLine("Client is disconnecting from server");
            }
        }
        serverThread.Join();
    }
4

1 に答える 1

5

LocalCertificateSelectionCallback使用する証明書を選択するための実装を提供する必要がありRemoteCertificateValidationCallback、ピアによって使用される自己署名証明書を受け入れるための実装を提供する必要があります。

自己署名証明書を作成するには (つまり、使い捨て)、 Creating a self-signed certificate in C# を参照してください。

ピアツーピア認証に SSL と SslStream を使用する SO の段階的な例もあります。

その意味を理解していることを確認してください。提示された証明書を実際に検証していないため、中間者がトラフィックを盗聴する可能性があります。言い換えれば、これはまったく認証の形式ではなく(SOリンクされた回答で示唆されているように)、誰かとのプライベートな通信を取得する方法にすぎませんが、誰と正確に知りません。別の方法としては、ルート証明書を使用して、使用する各破棄証明書に署名し、クライアントで証明書チェーンを検証する方法がありますが、これではブログ リンクと比較して証明書の生成が大幅に複雑になります。

于 2012-07-09T17:32:13.123 に答える