首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

在mina中兑现TSL/SSL双向认证连接(1)

2012-11-14 
在mina中实现TSL/SSL双向认证连接(1)本文需要读者对mina和SSl原理有一定的了解,所以本文中对mina和SSL的原

在mina中实现TSL/SSL双向认证连接(1)
本文需要读者对mina和SSl原理有一定的了解,所以本文中对mina和SSL的原理,不做详细的介绍。

TSL/SSL双向认证连接:Server端和Client端通信,需要进行授权和身份的验证,即Client只能接受Server的消息,Server只能接受Client的消息。这样就可以在客户机和服务器之间通过TCP/IP协议安全地传输数据。

在mina中实现TSL/SSL双向认证连接,本人目前所知有三种方式:
1.Server端和Client端各自拥有自签名的私有密钥证书,重写的 javax.net.ssl.X509TrustManager接口中的三个方法实现Server端和Client端信认证书。
2.Server端和Client端各自拥有自签名的私有密钥证书,并且互相交换公钥,通过对方公钥互相信认对方证书。
3.Server端和Client端各自拥有可信认的第三方认证机构(CA)签名私有密钥证书,通过CA互相信认对方证书。
以上三种方式,实现复杂度从低到高,灵活度安全性也从低到高。本系列文章将将会从简到难分别介绍三种方式的TSL/SSL双向认证连接。

下面我们介绍第一种实现方式:Server端和Client端各自拥有自签名的私有密钥证书,重写的 javax.net.ssl.X509TrustManager接口中的三个方法实现Server端和Client端信认证书。

首先,创建Server端和Client端各自的私有密钥证书,在这里使用keytool,关于keytool的使用在这里不作详细介绍,请参考它处。

1.创建Server端KeyStore文件serverKeys.jks,包含一个用于服务器的证书 :


2.创建Client端KeyStore文件clientKeys.jks,分别包含用于虚构的通信者 Alice 和 Bob 的证书 :

keytool -genkey -alias bob -keysize 1024 -validity 3650 -keyalg RSA -dname "CN=Bob, OU=Developer,O=Techstar, L=Beijing, S=Beijing, C=CH" -keypass 123456 -storepass 123456 -keystore clientKeys.jks

其次重写的 javax.net.ssl.X509TrustManager接口中的三个方法实现Server端和Client端信认证书,代码中BogusTrustManagerFactory类有关X509TrustManager实现的片断,具体参考源码

private static KeyManager[] getKeyManagers(String keysfile, String password) throws GeneralSecurityException,IOException {// First, get the default KeyManagerFactory.KeyManagerFactory kmf = KeyManagerFactory.getInstance(KEY_MANAGER_FACTORY_ALGORITHM);// Next, set up the TrustStore to use. We need to load the file into// a KeyStore instance.KeyStore ks = KeyStore.getInstance("JKS");InputStream in = BogusSslContextFactory.class.getResourceAsStream(keysfile);ks.load(in, password.toCharArray());in.close();// Now we initialise the KeyManagerFactory with this KeyStorekmf.init(ks, password.toCharArray());// And now get the TrustManagersreturn kmf.getKeyManagers();}


服务端(TLSServer)和客户端(TLSClient)测试代码比较简单,具体请参考源码,在这里有一点需要注意的就是在服务端添加加密过滤器 SslFilter时必须设置为:sslFilter.setNeedClientAuth(true),需要验证客户端证书。

源码中还包括了一个spring版本的TLSServerSpring、TSLClientSpring服务端、客户端测试类。

热点排行