C#でTCP、SSL通信を行いたいです。暗号化されていない。
お世話になっております。
C#でTCP、SSL通信を目的とし、以下のプログラムでサーバ側とクライアント側を作成しております。
環境開発はWindows7 32bit、Visual Studio Community2015、NETFramework4.5.2です。
PC2台にサーバとクライアントをそれぞれ立ち上げて行います。
クライアント側からサーバ側へ簡単なデータを送ります。
このプログラムでデータの送受信を見ましたら、暗号化されていないデータが見られました。(以下のプログラムですとHelloがもろ見えでした)
データを見たのはワイヤーシャークというソフトです。
サーバー側とクライアント側の初期のデータのやり取りを見ますと、
Client→Server「client hello」
↓
Server→Client「server hello,certificate,server hello done」
↓
Client→Server「ClientKeyExchange,ChangeCipherSpec」
となっておりました。ですので、サーバ認証はOKだと思っております。(自己署名証明書です)
その後、暗号化されたデータのやり取りを、、、と思ったのですが、暗号化されていませんでした。
本当に申し訳ありませんが、送受信の部分はうろ覚えです。
ただ、NetworkStreamのReadとwriteを使用して送受信をしていたのは覚えています。
質問は以下の通りです
1.NetworkStreamでの通信は暗号化されないのでしょうか。もしそうでしたら、暗号化されたデータのやり取りをする方法をご教授いただきたいです。
もしくは、ワイヤーシャークで取得しているデータは複合化されているデータなのでしょうか?
2.記載したプログラムでSSLの初期の「clientHello」であったり、鍵の交換であったりのやり取りは、クライアントを認証する部分で勝手にやってくれるのでしょうか。
それとも、本当は一つ一つのやり取り(鍵を生成して相手に渡す等)をプログラムする必要があるのでしょうか。
長くて申し訳ありません。よろしくお願いいたします。
サーバ側のプログラムになります。
TcpListener listener = new TcpListener(IPAddress.Any, 1300);
listener.Start();
// クライアントとの接続を待ちます
TcpClient clientSocket = listener.AcceptTcpClient();
X509Certificate certificate = new X509Certificate("自己署名証明書のパス",
"自己署名証明書のパスワード");
// sslStreamを生成しclientSocketのデータを受け取ります
using (SslStream sslStream = new SslStream(clientSocket.GetStream()))
{
// 証明書からクライアントを認証
sslStream.AuthenticateAsServer(certificate);
// 受信
Byte[] bytes = new Byte[17];
NetworkStream RStream = clientSocket.GetStream();
while((i = RStream.Read(bytes, 0, bytes.Length))!=0)
{
String data = System.Text.Encoding.UTF8.GetString(bytes, 0, i);
Console.WriteLine(String.Format("受信: {0}", data[0]));
}
}
クライアント側のプログラムになります。
static void Main(string[] args)
{
// Connect as client to port 1300
string server = "127.0.0.1";
TcpClient client = new TcpClient(server, 1300);
// sslStreamを生成
using (SslStream sslStream = new SslStream(client.GetStream(), false,
new RemoteCertificateValidationCallback(ValidateServerCertificate), null))
{
// サーバからの証明書を見て認証
sslStream.AuthenticateAsClient(server);
// 送るデータ
Byte[] data = System.Text.Encoding.UTF8.GetBytes("Hello");
NetworkStream sstream = client.GetStream();
stream.Write(data, 0, data.Length);
}
// クライアントとのコネクトを解除
client.Close();
}
// 呼び出される↓
public static bool ValidateServerCertificate(object sender, X509Certificate certificate,
X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
// 証明書受け入れ
return true;
}