模拟SSL通讯

最近公司有项目组提到这样的需求,需要一个基于TCPIP协议的双向ssl加密中转平台,类似于信安世纪的bisafe的简化版,一端(A)搭建在企业那边,另一端(B)搭建在公司内部,要求企业那边代码和公司这边的代码都不改动。可以修改配置。A端和B端现在就是socket通讯的。目前只有B端向A端发请求,B端接收响应,暂时不存在A端主动发起请求。


整理了一下思路,需要在B端部署一个SocketServer,接收公司项目发出的请求,我取名叫BankSocketServer,BankSocketServer收到请求后将内容发送给A端的SSLSocketServer,所以需要在A端部署一个SSLSocketServer,SSLSocketServer接收到请求后解密,然后将内容发给企业。这样就实现了B端不改代码,只要修改SocketServer服务器的地址和端口,而且A端和B端的通讯是加密的,并且A端也不用做任何修改。


然后我做了三件事情。
第一件事情是了解什么是单向认证,什么是双向认证。下面的内容是从网上整理的,我觉得比较好理解。

单向认证:(私钥加密/公钥解密,公钥加密/私钥解密)
客户端向服务器发送消息,服务器接到消息后,用服务器端的密钥库中的私钥对数据进行加密,然后把加密后的数据和服务器端的公钥一起发送到客户端,客户端用服务器发送来的公钥对数据解密,然后在用传到客户端的服务器公钥对数据加密传给服务器端,服务器用私钥对数据进行解密,这就完成了客户端和服务器之间通信的安全问题,但是单向认证没有验证客户端的合法性。

双向认证:
(1)客户端向服务器发送消息,首先把消息用客户端证书加密然后连同时把客户端证书一起发送到服务器端
(2)服务器接到消息后用首先用客户端证书把消息解密,然后用服务器私钥把消息加密,把服务器证书和消息一起发送到客户端
(3)客户端用发来的服务器证书对消息进行解密,然后用服务器的证书对消息加密,然后在用客户端的证书对消息在进行一次加密,连同加密消息和客户端证书一起发送到服务器端,
(4)到服务器端首先用客户端传来的证书对消息进行解密,确保消息是这个客户发来的,然后用服务器端的私钥对消息在进行解密这个便得到了明文数据。

第二件事情是怎么用java实现SSL双向认证。
互联网有很多资料,因为时间比较着急,就直接百度了,附一个链接:http://avery-leo.iteye.com/blog/276096

第三件事情就是写代码了,花了一天多时间,其实核心代码并不复杂,也不多,时间比较紧,但我还是想尽量把程序写好,写得通用,方便扩展。附件里有代码。有单元测试。可以直接运行,在此为了备忘。

猜你喜欢

转载自wuxiaozeng2440.iteye.com/blog/2153142