大家好,欢迎来到IT知识分享网。
JSSE (Java SecuritySocket Extension,Java安全套接字扩展)是Sun为了解决在Internet上的安全通讯而推出的解决方案。它实现了SSL和TSL(传输层安全) 协议。在JSSE中包含了数据加密,服务器验证,消息完整性和客户端验证等技术。通过使用JSSE,开发人员可以在客户机和服务器之间通过TCP/IP协 议安全地传输数据。这篇文章主要描述如何使用JSSE接口来控制SSL连接。
首先我通过一个简单的客户机/服务器程序来介绍如何利用 JSSE进行编程。当建立客户端时,我们需要配置KeyStore和TrustStore文件,这样在程序中我们才可以从客户端的文件系统中加载它们。然 后文章将讨论授权和身份验证方面的问题。通过从KeyStore中选择不同的授权,客户端程序可以连接到不同的服务器。
在运行 JSSE程序前,你需要正确安装JSSE。如果你安装了J2SE 1.4,JSSE已经被自动安装并配置好了,如果你使用的是其他版本的Java,你需要从官方站点上下载并安装JSSE,安装过程这里就不再赘述。由于 JSSE是在J2SE 1.4中才成为标准的,并且J2SE 1.4中的JSSE和以前的JSSE有一些细微的差别,而且文中的例子都是在J2SE 1.4下调试的,因此推荐你使用J2SE 1.4运行这些例子。
这样keytool就在当前目录下创建了三个授权文件。然后我们将server.cer文件导入到clientTrust文件中;将alice.cer和bob.cer导入到serverTruest文件中:
SimpleSSLServer
让 我们先来看一下SimpleSSLServer。在main()方法中,程序获得了缺省的SSLServerSocketFactory对象;然后利用 SSLServerSocketFactory创建一个SimpleSSLServer对象,最后调用start()方法启动 SimpleSSLServer对象。
SimpleSSLClient
SimpleSSLClient类比较简单,但是在后面的一些比较复杂的例子中的类会继承该类。在getSLLSocketFactory()方法中,程序返回缺省的工厂类:
在下面的例子中,我们将使用CustomTrustStoreClient来动态定义KeyStore和TrustStore。首先让我们先运行一下CustomTrustStoreClient:
当运行前几个例子的时候,不知道大家是否注意到服务器端显示的授权的标识名称。在前面我们授权给了两个人:Alice和Bob,在运行程序时 JSSE会从中任选一个。在我的计算机上JSSE选择的总是Bob,或许在你的计算机上情况会有所不同。下面让我们来看一看最后一个例子程序: SelectAliasClient。这个例子使你能够在运行客户端时使用指定的授权。例如你需要指定使用Alice的授权,由于Alice的别名是 alice,你需要在命令窗口中键入下面的命令:
1.JSSE调用chooseClientAlias()方法获得指定的授权。
String[] validAliases=baseKM.getClientAliases(keyType, issuers);
if (validAliases!=null) {
for (int j=0; j< !aliasFound; && j++)>
if (validAliases[j].equals(alias)) aliasFound=true;
}
}
}
if (aliasFound) return alias;
else return null;
}
我 们可以看到在程序中,chooserClientAlias()方法实际上多次调用了getClientAliases()方法,每次都针对不同的授权类 型。AliasForingKeyManager还实现了X509KeyManager接口的其他五个方法,在这里就不再一一赘述了。
然后我们就可以在程序中用AliasForingKeyManager对象来替代KeyManager对象了。在 getSSLSocketFactory()方法中,我们只需要将通过调用getKeyManagers()方法获得KeyManager对象数组,然后 将其强制转化为AliasForcingKeyManager对象就可以了。下面是新的getSSLSocketFactory()方法的代码:
protected SSLSocketFactory getSSLSocketFactory()
throws IOException, GeneralSecurityException
{
// 调用父类中的方法获得TrustManager和KeyManager
KeyManager[] kms=getKeyManagers();
TrustManager[]tms=getTrustManagers();
// 如果指定了别名,将KeyManagers包装在AliasForcingKeyManager对象中.
if (alias!=null) {
for (int i=0; i< i++)>
// 这里只处理了X509KeyManager接口
if (kms instanceofX509KeyManager)
kms=new AliasForcingKeyManager((X509KeyManager)kms,alias);
}
}
// 利用TrustManagers和已经被包装的KeyManagers创建一个SSLContext对象.
SSLContext context=SSLContext.getInstance(“SSL”);
context.init(kms, tms, null);
// 获得SocketFactory对象.
SSLSocketFactory ssf=context.getSocketFactory();
return ssf;
}
我们可以使用同样的方法来替换TrustManager对象,这样我们就可以控制JSSE验证授权的机制。具体的实现就留给读者朋友去解决了。
小结
在这篇文章中,我们讲述了使用JSSE的一些小技巧。读完这篇文章后,我相信大家因该知道如何通过编程实现下面的任务:
· 使用HandshagCompletedListerner对象来获得关于连接的信息。
· 从SSLContext对象中获得一个SLLSocketFactory对象。
· 使用动态的TrustStroe或KeyStore。
· 突破在JSSE中KeySotre的密钥的每个授权的密钥必须相同的限制。
· 通过实现自己的KeyManager类来指定JSSE使用的授权。
如果大家有兴趣的话,还可以进一步将这些技术进行扩展。例如你可以在JSSE的其他类中使用X509KeyManager 接口,也可以在TrustStore和KeyStore的实现类中从数据库中读取授权信息。但是在使用自己编写的TrustStore, KeyStore,TrustManager和KeyManager的时候,需要非常小心,因为任何一个细微的错误都可能导致SSL连接不再是安全的了。
作者简介:冯睿毕业于美国北伊利诺大学计算机和电气工程系,获工程硕士学位。曾就职于NewMonics公司,进行Java虚拟机部分包的设计和开发和Java底层的性能优化工作。目前负责一些政府和企业级GIS系统的设计和实现。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/125087.html