分享
 
 
 

用JSSE定制SSL连接

王朝html/css/js·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

JSSE(Java Security Socket 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运行这些例子。

在深入介绍JSSE之前,让我们来一个简单的客户机/服务器程序,程序中包含了两个文件:SimpleSSLServer和SimpleSSLClient。在运行程序之前,你需要配置下面这些KeyStore和TrestStore文件:

? 一个客户端的KeyStore文件,该文件中包含了对Alice和Bob的授权。

? 一个服务器端的KeyStore文件,该文件中包含了对server的授权。

? 一个名为clientTrust的客户端TrustStore文件,该文件中包含了对server的授权。

? 一个名为serverTrust的服务器端TrustStore文件,该文件中包含了对Alice和Bob的授权。

使用keytool可以帮助你创建这些文件(该工具在Java的bin目录下):

? 一个客户端的KeyStore文件,该文件中包含了对Alice和Bob的授权。

在命令窗口中输入下面的命令:

keytool -genkey -alias alice -keystore clientKeys

窗口中会出现下面的提示,根据提示输入相应的信息:

输入keystore密码: password

您的名字与姓氏是什么?

[Unknown]: Alice

您的组织单位名称是什么?

[Unknown]: Development

您的组织名称是什么?

[Unknown]: DCQ

您所在的城市或区域名称是什么?

[Unknown]: ChongQing

您所在的州或省份名称是什么?

[Unknown]: ChongQing

该单位的两字母国家代码是什么

[Unknown]: CH

CN=Alice, OU=Development, O=DCQ, L=ChongQing, ST=ChongQing, C=CH 正确吗?

[否]: 是

输入的主密码(如果和 keystore 密码相同,按回车):通过相同的方式可以建立对Bob的授权。keytool -genkey -alias bob -keystore clientKeys注意在名字与姓氏一栏中填写Bob。在完成后可以键入下面的命令来检测是否已经正确完成了授权。keytool -list -v -keystore clientKeys? 一个服务器端的KeyStore文件,该文件中包含了对server的授权。在命令窗口中键入下面的命令:keytool -genkey -alias server -keystore serverKeys注意将密码设为password,名字与姓氏设定为Server。完成授权后同样可以通过上面提到的命令来检测。? 一个名为clientTrust的客户端TrustStore文件,该文件中包含了对server的授权。以及一个名为serverTrust的服务器端TrustStore文件,该文件中包含了对Alice和Bob的授权。keytool -export -alias server -keystore clientKeys -file server.cer输入keystore密码: password保存在文件中的认证keytool -export -alias alice -keystore clientKeys -file alice.cer输入keystore密码: password保存在文件中的认证keytool -export -alias bob -keystore clientKeys -file bob.cer输入keystore密码: password保存在文件中的认证这样keytool就在当前目录下创建了三个授权文件。然后我们将server.cer文件导入到clientTrust文件中;将alice.cer和bob.cer导入到serverTruest文件中:keytool -import -alias server -keystore clientTrust -file server.cerkeytool -import -alias alice -keystore serverTrust -file alice.cerkeytool -import -alias bob -keystore serverTrust -file bob.cer到目前为止,在当前目录下包含clientKeys,serverKeys,clientTrust,serverTrust四个文件。完成了KeyStore和TrustStore的设置后就可以运行例子程序了。首先需要运行服务器程序:java -Djavax.net.ssl.keyStore=serverKeys-Djavax.net.ssl.keyStorePassword=password-Djavax.net.ssl.trustStore=serverTrust-Djavax.net.ssl.trustStorePassword=password SimpleSSLServer在命令行中我们指定了keyStore属性为serverKeys。由于服务器程序需要获得客户端的授权信息,我们指定trustStore为serverTrust。这样SSLSimpleServer就可以验证由SSLSimpleClient提供的授权信息。当服务器程序成功运行后,你会看到下面的提示:SimpleSSLServer running on port 49152这时候服务器会等待客户端发出建立连接的申请。如果你希望在另一个端口上运行服务器程序,可以在命令中指定-port xxx参数,其中xxx是端口号。然后在另一个命令窗口中运行客户端程序:java -Djavax.net.ssl.keyStore=clientKeys-Djavax.net.ssl.keyStorePassword=password-Djavax.net.ssl.trustStore=clientTrust-Djavax.net.ssl.trustStorePassword=password SimpleSSLClient客户端程序会试图向本机的49152端口建立SSL连接。同样你可以通过-port参数指定端口号,也可以通过-host参数指定主机名称。当连接成功后,会出现下面的提示信息:Connected同时在服务器端会提示用户客户端已经连接成功。SimpleSSLServer让我们先来看一下SimpleSSLServer。在main()方法中,程序获得了缺省的SSLServerSocketFactory对象;然后利用SSLServerSocketFactory创建一个SimpleSSLServer对象,最后调用start()方法启动SimpleSSLServer对象。SSLServerSocketFactory ssf=(SSLServerSocketFactory)SSLServerSocketFactory.getDefault();SimpleSSLServer server=new SimpleSSLServer(ssf, port);server.start();由于服务器是在一个单独的线程中运行的,main()方法启动了服务器之后就退出了。start()方法启动了一个新的线程,该线程执行run()方法中的代码。在run()方法中创建了一个SSLServerSocket对象,然后设定服务器需要进行客户端验证:SSLServerSocket serverSocket= (SSLServerSocket)serverSocketFactory.createServerSocket(port);serverSocket.setNeedClientAuth(true);调用run()方法后,程序进入了一个死循环,等待客户端的连接申请。循环中的每个Socket对应一个HandshakeCompletedListener对象(该对象是用来显示客户验证信息中的标识名称[distinguished name]的)。Socket的InputStream对象被包装在一个InputDisplayer对象中,这个InputDisplayer对象运行在另外一个线程中,用来将Socket接收到的数据发送到System.out。下面的代码是SimpleSSLServer中的主循环体:while (true) {String ident=String.valueOf(id++);//监听连接请求.SSLSocket socket=(SSLSocket)serverSocket.accept();//通过使用HandshakeCompletedListener对象,程序进行授权验证.HandshakeCompletedListener hcl=new SimpleHandshakeListener(ident);socket.addHandshakeCompletedListener(hcl);InputStream in=socket.getInputStream();new InputDisplayer(ident, in);}程序中的SimpleHandshakeListener类实现了HandshakeCompletedListerner接口。在SimpleHandshakeListener类中实现了handshakeCompleted()方法,该方法在SSL握手阶段完成后将被JSSE调用。它将显示出客户端的标识名称:class SimpleHandshakeListener implements HandshakeCompletedListener{String ident;/*** 构造函数.*/public SimpleHandshakeListener(String ident){this.ident=ident;}/**当SSL握手过程完成后该方法被激活. */public void handshakeCompleted(HandshakeCompletedEvent event){//显示授权信息.try {X509Certificatecert=(X509Certificate)event.getPeerCertificates()[0];String peer=cert.getSubjectDN().getName();System.out.println(ident+": Request from "+peer);}catch (SSLPeerUnverifiedException pue) {System.out.println(ident+": Peer

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有