在C#中创建SSL / TCP连接的最佳方法是什么?我想我要么指定没有证书要么动态创建其中一个苍蝇(但它们应该是一次性的……).实现它的最简单方法是什么?我试过简单地将一个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(); }您需要提供
LocalCertificateSelectionCallback
的实现来选择要使用的证书,并且您需要提供
RemoteCertificateValidationCallback
的实现以接受对等方使用的自签名证书.
要创建自签名证书(即丢弃),请参阅Creating a self-signed certificate in C#.
在Using SSL and SslStream for peer to peer authentication,SO上还有一个分步示例.
确保你理解其含义,即.如果您实际上没有验证所提供的证书,那么中间人可以放弃您的流量.换句话说,这根本不是一种身份验证形式(如SO链接答案中所建议的那样),而只是一种与某人进行私人交流的方式,但您并不确切地知道与谁完全相关.另一种方法是使用根证书来签署所使用的每个丢弃证书并验证客户端中的证书链,但与博客链接相比,这会显着复制证书的生成.
精彩评论