程序用JSSE定制SSL连接

ssl连接  时间:2021-01-23  阅读:()

用JSSE定制SSL连接http://www.yunyo ub ar.c o m/邮件群发

JSSE Java SecuritySocket Extension Java安全套接字扩展是Sun为了解决在Internet上的安全通讯而推出的解决方案。它实现了SSL和TSL传输层安全协议。在JSSE中包含了数据加密服务器验证消息完整性和客户端验证等技术。

通过使用JS SE开发人员可以在客户机和服务器之间通过T CP/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之前让我们来一个简单的客户机服务器程序程序中包含了两个文件 S imp le S S LS erve r和S imp le S S LC lie nt。在运行程序之前你需要配置下面这些KeyStor e和Tres tStor e文件

·一个客户端的KeyStore文件该文件中包含了对Alic e和Bo b的授权。

·一个服务器端的KeyS tor e文件该文件中包含了对server的授权。

·一个名为c lientTrust的客户端TrustS tore文件该文件中包含了对server的授权。·一个名为serverTrus t的服务器端TrustSto re文件该文件中包含了对Alice和Bob的授权。

使用keytoo l可以帮助你创建这些文件该工具在Java的b in目录下 

·一个客户端的KeyStore文件该文件中包含了对Alic e和Bo b的授权。

在命令窗口中输入下面的命令keytoo l-genkey-alias alice-keystore c lientKeys

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

输入keys tore密码 p ass word

您的名字与姓氏是什么

[Unknown] Alice

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

[Unknown] Development

您的组织名称是什么

[Unknown] DCQ

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

[Unknown] ChongQ ing

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

[Unknown] ChongQ ing

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

[Unknown] CH

CN=Alice,OU=Development,O=DCQ,L=ChongQ ing,S T=ChongQ ing,C=CH正确吗

[否] 是

输入的主密码

如果和keys tore密码相同按回车 

通过相同的方式可以建立对Bob的授权。keytoo l-genkey-alias bob-keystore c lientKeys

注意在名字与姓氏一栏中填写Bob。在完成后可以键入下面的命令来检测是否已经

正确完成了授权。keytoo l-lis t-v-ke ysto re c lie ntKe ys????

·一个服务器端的KeyS tor e文件该文件中包含了对server的授权。

在命令窗口中键入下面的命令keytoo l-genkey-alias s erver-keystore serverKeys

注意将密码设为passwo rd名字与姓氏设定为Server。完成授权后同样可以通过上面提到的命令来检测。

·一个名为c lientTrust的客户端TrustS tore文件该文件中包含了对server的授权。以及一个名为serverTrus t的服务器端TrustSto re文件该文件中包含了对Alice和Bob的授权。keytool-export-alias server-keystore clientKeys -file server.cer

输入keys tore密码 p ass word

保存在文件中的认证keytoo l-export-alias alice-keystore clientKeys -file alice.cer

输入keys tore密码 p ass word

保存在文件中的认证keytoo l-export-alias bob-keystore clientKeys -file bob.cer

输入keys tore密码 p ass word

保存在文件中的认证

这样keytoo l就在当前目录下创建了三个授权文件。然后我们将serve r.cer文件导入到c lientTrust文件中将alice.cer和bob.cer导入到serverTruest文件中keytoo l-import-alias server-keystore c lientTrust -file server.cer

keytoo l-import-alia s alice-keystore serverTrust -file alice.cerkeytool-import-alias bob-keystore serverTrust-file bob.cer

到目前为止在当前目录下包含clientKeys serverKeys clientTrust serverTrust四个文件。完成了KeyStore和Trus tStore的设置后就可以运行例子程序了。首先需要运行服务器程序java-Djavax.net.ssl.keyStore=serverKeys

-Dj avax.net.s s l.ke ySto reP ass word=pa sswo rd

-Djavax.net.s s l.trustS tore#NAME?

-Djavax.net.s s l.trustS torePa sswo rd=password S imp leS S LS erver

在命令行中我们指定了keyS tore属性为s erverKe ys。 由于服务器程序需要获得客户端的授权信息我们指定trustStore为serverTrust。这样S S LS imp leServer就可以验证由S SLS imp leC lient提供的授权信息。当服务器程序成功运行后你会看到下面的提示

SimpleSSLServer running on port 49152????

这时候服务器会等待客户端发出建立连接的申请。如果你希望在另一个端口上运行服务器程序可以在命令中指定-port xxx参数其中xxx是端口号。

然后在另一个命令窗口中运行客户端程序java-Djavax.net.ss l.keyStore=c lientKeys

-Dj avax.net.s s l.ke ySto reP ass word=pa sswo rd

-Djavax.net.s s l.trustS tore=c lientTrust

-Dj avax.net.s s l.trustS torePa sswo rd=pass word S imp leS S LC lie nt

客户端程序会试图向本机的49152端口建立SSL连接。 同样你可以通过-port参数指定端口号也可以通过-host参数指定主机名称。当连接成功后会出现下面的提示信息

C onnected

同时在服务器端会提示用户客户端已经连接成功。

Simp leS S LServer

让我们先来看一下Simp leS S LServer。在main  方法中程序获得了缺省的S SLServerSocketFactory对象然后利用S S LServerSocketFactory创建一个Simp leS S LS erve r对象最后调用s tart  方法启动S imp leS S LS erve r对象。SSLServerSocketFactory ss f=

(S SLServerSocketFactory)S S LServerSocketFactory.getDefault();

SimpleSSLServer server=new SimpleSSLServer(ssf,port);server.s tart();

由于服务器是在一个单独的线程中运行的 main  方法启动了服务器之后就退出了。 s tar t  方法启动了一个新的线程该线程执行r un  方法中的代码。在r un

 方法中创建了一个S SLServerSocket对象然后设定服务器需要进行客户端验证

SSLServerSocket serverSocket=

(S SLServerSocket)serverSocketFactory.createServerSocket(port);serverSocket.setNeedC lientAuth(true);

调用run  方法后程序进入了一个死循环等待客户端的连接申请。循环中的每个Socket对应一个HandshakeCo mp letedListener对象该对象是用来显示客户验证信息中的标识名称distinguished name的 。 Socket的InputStream对象被包装在一个InputDisp layer对象中这个InputDisp layer对象运行在另外一个线程中用来将Socket接收到的数据发送到S ystem.out。下面的代码是S imp leS SLServer中的主循环体while(true) {

String ident=String.valueO f(id++);

//监听连接请求.

SSLSocket socket=(SSLSocket)serverSocket.aclearcase/"target="_blank">ccept();

//通过使用HandshakeCo mp letedListener对象,程序进行授权验证.

HandshakeComp letedListener hcl=new S imp leHandshakeListener(ident);socket.addHandshakeCo mp letedListener(hc l);

InputStream in=socket.getInputStream();new InputDisplayer(ident, in);

}

程序中的Simp leHandshakeListener类实现了HandshakeComp letedListerner接口。在Simp leHandshakeListener类中实现了handshakeComp leted  方法该方法在S S L握手阶段完成后将被JSSE调用。它将显示出客户端的标识名称class S imp leHandshakeListener imp lements HandshakeComp letedListener

{

String ident;

/**

*构造函数.

*/public S impleHandshakeListener(String ident)

{this.ident=ident;

}

/**当SSL握手过程完成后该方法被激活. */public void handshakeCompleted(HandshakeCompletedEvent event)

{

//显示授权信息.try{

X509 C ertific atecert=(X509C ertificate)e ve nt.getPeerC e rtificates()[0];

String peer=cert.getSubjectDN().getName();

System.out.println(ident+":Request from"+peer);

}catch(SS LPeerUnverifiedException pue) {

System.out.println(ident+":Peer unverified");

}

}

}

用红色字体表示的两行代码是这段代码的核心 getPeerCertificates  方法返回一个X509C ertific ated对象的数组。这些X509C ertificated对象创建了客户端的身份标识。在数组中的第一个元素是客户端的验证信息而最后一个通常是CA验证。当我们有了客户端的验证信息后。我们可以得到其中的标识名称并将它传送到Sys te m.o ut。

S imp le S S LC lie nt

S imp le S S LC lie nt类比较简单但是在后面的一些比较复杂的例子中的类会继承该类。在getSLLSocketFacto ry  方法中程序返回缺省的工厂类protected S SLSocketFactory getS S LSocketFactory()throws IOException,GeneralSecurityException

{return(S SLSocketFactory)S S LSocketFactory.getDe fault();

}

在runC lie nt()方法中程序处理了输入参数后获得S S LS ockFacto ry对象调用

connect  方法连接到服务器程序。在connect  方法中程序首先创建一个S SLSocket对象然后调用S S LSocket对象的startHandshang  方法启动和服务器端的握手过程。当握手过程完成后会触发一个HandshakeCo mp letedEvent事件。在服务器端的HandshakeCo mp letedListener对象会处理这个事件。事实上JSSE可以自动启动握手过程但是必须是在第一次有数据通过Socket传输的情况下。 由于在例子程序中直到用户在键盘上输入信息后才会有数据通过Socket传输而我们希望服务器端及时报告连接情况 因此我们用startS hake  方法来手工激活握手过程。public void connect(SSLSocketFactory sf)throws IOException

{socket=(SSLSocket)sf.createSocket(host,port);try{s ocket.startHands hake();

}catch(IOException ioe) {

//握手失败.关闭连接.try{socket.close();

}catch(IOException ioe2) {

//忽略该错误.

}socket=null;throw io e;

}

}

Simp leS SLClient类中的transmit  方法也很简单。首先程序将输入流包装到一个Reader对象中然后将输出流包装到一个Writer对象中最后将数据流输出到Socketboolean done=false;

while(!done) {

String line=reader.readLine();if(line!=null) {wr iter.wr ite(lin e);wr ite r.wr ite('\n');wr iter.flu s h();

}else done=true;

}

定制KeyS tor e和TrustS tore?

还记得我们是如何运行客户端的吗我们需要在命令行中指定keySto re,ke ySto reP as word, trustS tore和trus tSto rePass word参数 以至于整个命令显得过于冗长。事实上你可以在程序中指定KeyS tor e和Trus tS tore后面的例子中将告诉你如何实现这一点。 同时在例子中还会演示如何配置多个S SLSocketFactory对象其中每个S SLS ocketFac tory对象对应不同的KeySto re和Trus tSto re设置。如果没有这种技术在同一个虚拟机上的所有安全连接都只能使用同一个K eyS to re和TrustStore。对于比较小的应用程序这也许不会产生问题但是对于那些比较大的应用程序来说这绝对是一个严重的缺陷。

在下面的例子中我们将使用Custo mTrus tStoreC lie nt来动态定义Ke yStore和Trus tStore。首先让我们先运行一下Custo mTrustS toreC lientjava CustomTrustS toreC lient

为什么运行Custo mTrus tStoreC lie nt时不需要指定KeyS tore和TrustS tore参数呢这是应为在Custo mTrus tStoreC lie nt的代码中指定了KeyS tore C lie ntKe ys和TrustStore C lientTruts以及它们的密钥password 。如果你想使用其他的KeyStore、 TrustS tore或密钥可以使用-ks、 -kspass、 -ts和-tspa ss参数来指定。下

ShineServers(5美元/月)荷兰VPS、阿联酋VPS首月五折/1核1G/50GB硬盘/3TB流量/1Gbps带宽

优惠码50SSDOFF 首月5折50WHTSSD 年付5折15OFF 85折优惠,可循环使用荷兰VPSCPU内存SSD带宽IPv4价格购买1核1G50G1Gbps/3TB1个$ 9.10/月链接2核2G80G1Gbps/5TB1个$ 12.70/月链接2核3G100G1Gbps/7TB1个$ 16.30/月链接3核4G150G1Gbps/10TB1个$ 18.10/月链接阿联酋VPSCPU内存SS...

MechanicWeb免费DirectAdmin/异地备份

MechanicWeb怎么样?MechanicWeb好不好?MechanicWeb成立于2008年,目前在美国洛杉矶、凤凰城、达拉斯、迈阿密、北卡、纽约、英国、卢森堡、德国、加拿大、新加坡有11个数据中心,主营全托管型虚拟主机、VPS主机、半专用服务器和独立服务器业务。MechanicWeb只做高端的托管vps,这次MechanicWeb上新Xeon W-1290P处理器套餐,基准3.7GHz最高...

JustHost俄罗斯VPS有HDD、SSD、NVMe SSD,不限流量低至约9.6元/月

justhost怎么样?justhost服务器好不好?JustHost是一家成立于2006年的俄罗斯服务器提供商,支持支付宝付款,服务器价格便宜,200Mbps大带宽不限流量,支持免费更换5次IP,支持控制面板自由切换机房,目前JustHost有俄罗斯6个机房可以自由切换选择,最重要的还是价格真的特别便宜,最低只需要87卢布/月,约8.5元/月起!总体来说,性价比很高,性价比不错,有需要的朋友可以...

ssl连接为你推荐
相机内存卡数据恢复怎样恢复相机存储卡数据软银亏损65亿美元摩根大通巨亏20亿美元是什么原因造成的?聚酯纤维和棉哪个好聚酯纤维和棉 那个比较暖和啊电视直播软件哪个好目前最好的网络电视直播软件是哪个?录音软件哪个好录音软件哪个好用又简单ps软件哪个好PS软件用哪种比较好?急用!苹果手机助手哪个好苹果手机助手哪个好,苹果手机助手推荐?网页传奇哪个好玩求最好玩的网页传奇?杰士邦和杜蕾斯哪个好杜蕾斯好用还是杰士邦好要?游戏盒子哪个好游戏盒子哪个好?
便宜域名注册 vps代购 googleapps 新世界电讯 iis安装教程 xfce debian6 申请个人网页 40g硬盘 河南移动邮件系统 hktv 网通服务器 上海电信测速 atom处理器 免费个人主页 服务器防御 国外免费网盘 hdsky 聚惠网 restart 更多