質問: C#でTCP、SSL通信が出来るサーバとクライアントを作成したいと思っております。 ご教授をお願いできませんでしょうか。 環境開発はWindows7 32bit、Visual Studio Community2015、NETFramework4.5.2です。 PC一台にサーバとクライアントを立ち上げて行いたいと思っております。 プログラムの流れは以下のようにと考えております。 1.サーバはTcpListenerで接続待ちにしておきます。 2.クライアントは接続します。 3.サーバからクライアントへサーバ証明書を送ります。 4.クライアントはサーバ証明書からそのサーバが正しいか判定します。 5.SSL通信をはじめ、データのやり取りを行います。 参照で申し訳ないのですが以下のサイトで正にやりたいことではないかと考えております。 ただ、証明書の読み込みの部分で怒られてしまいます。証明書に関連付けられた秘密鍵云々・・・。 ここを上手くいく設定をご教授頂きたいです。 怒られた時は、適当にインターネットエクスプローラー>インターネットオプション>証明書で適当な証明書をエクスポートしまして、そのエクスポートしたファイルを指定しております。しかし、その証明書には鍵のエクスポート等の選択が「いいえ」しか選べません。ここも何か関係しているのではないかと考えております。 また、プログラムのことで質問なのですが、クライアント側の8行目から13行目の動作をご教授願いたいです。SslStreamオブジェクトから(client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null)を引数にしsslStreamを生成して(合ってますでしょうか?)usingとなぜ{・・・}があるのか、書き方等含めわかりません。こちらもご教授頂きたいです。また、22行を通る時にValidateServerCertificateメソッドを行うという認識で合っていますでしょうか。 お手数ですがよろしくお願いいたします。
回答: 1. 一般に公開されているHTTPSサーバーの証明書の秘密鍵は文字通り秘密なので自分のサーバー証明書として使用することはできません。ですので自分で証明書を用意する必要がありますが、テスト用途であれば**自己署名証明書**(オレオレ証明書)を使うのが一般的かと思います。 2. 8行目の`using`は**usingステートメント**と呼ばれる文法で、処理の最後に必ず`sslStream.Dispose()`が呼び出されるという効果があります。 3. クライアント側の処理自体はMainメソッドで完結するため、22行目が直接実行されることはありません。`ValidateServerCertificate`は`using`ブロック内のどこかで`SslStream`によって呼び出されます。