您的位置:首页 > 理论基础 > 计算机网络

证书的应用之一 —— TCP&SSL通信实例及协议分析(下)

2012-12-27 10:56 459 查看
转自:http://www.cnblogs.com/piyeyong/archive/2010/07/07/1773086.html

前面两部分分别讲解了如何在.net程序中使用SSL实现安全通信以及SSL的通信过程,并通过抓包工具具体分析了ssl的握手过程,本文通过一个demo来模拟ssl协议,在TCP之上实现自己的安全通信。

 

创建证书

为了实现安全的通信,必须使用证书对传输的数据进行加密,有两种方法可以得到证书,一是安装CA服务器,使用CA来发放证书,二是通过makecert.exe工具自己创建。

创建服务器证书:

cmd>makecert.exe -r -pe -n "CN=MySslServer" -sky Exchange -ss My

创建客户端证书

cmd>makecert.exe -r -pe -n "CN=MySslClient" -sky Exchange -ss My

关于makecert.exe的更多信息可以操作这里

 

建立TCP连接

使用普通的Socket类来建立TCP连接即可。后续的握手,传输数据都是在TCP之上的,在这里,定义每条信息的第一个字节是类型,0x01是整数,0x02是session key,0x03是应用层数据,0x04是错误信息,未使用。

我们知道TCP通信是stream的,消息没有边界,有可能发送方发送的数据,在接收方两次才能接收完,或者发送方连续发送两次数据,接收方一次就全部接受,这就要求应用层自己对消息的边界进行区分,常用的有3种方法,一是固定长度,所有消息长度一样,不够就填充,显然不够实用而且浪费带宽;二是定义消息边界,每条消息以固定字节流结尾如<EOF>,如果传输的数据刚好含有这样的字节流,就必须进行转义;三是消息的起始处使用固定字节来描述本消息的长度。本文为方便起见,没有进行消息边界处理,每两次发送有个间隔。



交换证书

在TCP连接建立之后,开始进行握手过程,主要是交换证书,交换session key。

server与client各自将自己的证书发送给对方,证书被export成.cer格式,只含有public key。证书的作用一是交换session key,二是发送数据时签名。

 1             byte[] certBytes = so.localCert.Export(X509ContentType.Cert);
2 byte[] sentBytes = AddType(certBytes, type);
3 so.workSocket.Send(sentBytes, 0, sentBytes.Length, SocketFlags.None);
4 Console.WriteLine("Send>>>>>>>>>>>>>>>>>>>>>");
5 PrintCert(so.localCert);
6 。。。。。。
7 byte[] data = RemoveType(so.buffer, read);
8 so.remoteCert = new X509Certificate2(data);
9 Console.WriteLine("Recv<<<<<<<<<<<<<<<<<<<<<<");
10 PrintCert(so.remoteCert);

交换session key

本demo使用DES对称算法来加密,必须在发送应用层数据之前交换算法的key,使用双方约定固定的IV。

其中一方生成随机的key,用对方的证书加密,调用RSA的Encrypt方法,会使用Public key,将加密后的数据发送给对方,由于只有对方才有证书的private key,所以也只有对方才能解密出key,第三方即使中途截获了数据也不能破解出key。

 

生成session key


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: