web-dev-qa-db-ja.com

ソケットtcpを使用したC#ssl / tls

私はC#開発の初心者です。私はtcpではなくssl/tlsを使用しようとしていますが、私のコードでは、system.net.sockets.socket(裸のソケット)がtcpclientまたはtcplistnerではなく使用されています。私はネット上で少なくとも200のリンクを検索しましたが、それに関連するものは何もありませんでした。使用するコーディングを減らし、TCPソケット接続でsslまたはtsllを実行したいと思います。クライアント、サーバー、CA証明書、.key形式のキーがあります。例やリンクを手伝ってください。詳細を感じたら質問できます。

7
Bittu Shah

TcpClientを使用したくないのですか? TcpClientおよびSsltreamを使用してSSL接続を作成するのは非常に簡単です。何千もの同時接続が必要でない限り、私はTcpClientSSLStreamを使い続けます。

基本的なTcpClientおよびSslStreamの例は次のようになります。

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つのソリューションがすべてに当てはまるかどうかはわからないので、ここにいくつか挙げます。

  1. [Asynchronous Client Socket] を使用することから始めるのが良いかもしれません
  2. 利用できる既存のライブラリがいくつかあります。私は Nito/Async を使用しましたが、2009年以降更新されたとは思われません。バージョン2の話がありましたが、それが実現したとは思いません。
  3. 私はそれに慣れていませんが、CodeProjectには C#SocketAsyncEventArgs High Performance Socket Code があります
  4. Microsoftのガイダンスを確認してください 非同期Winsockを使用した高性能.NETソケットサーバー
  5. ソケット操作待ち を含む、Stephen Toubの発言をすべて読んでください。

SSLについては特に触れていませんが、SslStreamクラスを調べています。

また、バッファプーリングを調べる必要があります。何千ものクライアントにサービスを提供している場合、ガベージコレクションが問題になります。これの優れた紹介は Sunny Ahuwanyaのブログ です。


https://github.com/StephenCleary/AsyncEx

前。

12
Mark

System.Net.Sockets.NetworkStream ソケットをラップして System.Net.Security.SslStream ネットワークストリームをラップします。

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