JSSE(Java SecuritySocket Extension,Java安全套接字扩展)

JSSE(Java SecuritySocket Extension,Java安全套接字扩展)JSSE JavaSecurity Java 安全套接字扩展 是 Sun 为了解决在 Internet 上的安全通讯而推出的解决方案

大家好,欢迎来到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

(0)
上一篇 2025-09-30 18:00
下一篇 2025-09-30 18:10

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信