证书的应用之一 —— TCP&SSL通信实例及协议分析(下)
来源:互联网 发布:css modules css in js 编辑:程序博客网 时间:2024/05/17 09:37
转自: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。
- 证书的应用之一 —— TCP&SSL通信实例及协议分析(下)
- 证书的应用之一 —— TCP&SSL通信实例及协议分析(下)
- 证书的应用之一 —— TCP&SSL通信实例及协议分析(中)
- 证书的应用之一 —— TCP&SSL通信实例及协议分析(上)
- 证书的应用之一 —— TCP&SSL通信实例及协议分析(中)
- 证书的应用之一 —— TCP&SSL通信实例及协议分析(上)
- 证书的应用之一 —— TCP&SSL通信实例及协议分析(中)
- Java安全通信、数字证书及应用实践(转SSL证书)
- Qt开发——TCP协议下的socket通信
- KWP2000协议:协议应用及实例分析
- SSL的TCP通信
- SSL协议的分析及实现
- SSL协议的分析及实现
- SSL协议的分析及实现
- SSL协议的分析及实现
- SSL协议的分析及实现
- SSL协议的分析及实现
- tcp/iP协议族——IP工作原理及实例详解(下)
- java _-----> web 项目
- js行背景变色、显示提示层的代码
- hyperion高光谱数据L1Gst和L1R数据的区别
- sysctl 修改内核参数马上生效
- NHibernate一个完整的例子
- 证书的应用之一 —— TCP&SSL通信实例及协议分析(下)
- Mac系统下Apache+PHP+MySQL配置
- PL/SQL Developer如何保存密码
- IBATIS操作BLOB和CLOB
- 清除TFS版本控制信息
- 避免对函数中继承得来的默认参数值进行重定义
- ubuntu用户和组 添加删除
- linux shell常用命令收藏
- H.264详解