程序用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参数来指定。下

georgedatacenter39美元/月$20/年/洛杉矶独立服务器美国VPS/可选洛杉矶/芝加哥/纽约/达拉斯机房/

georgedatacenter这次其实是两个促销,一是促销一款特价洛杉矶E3-1220 V5独服,性价比其实最高;另外还促销三款特价vps,georgedatacenter是一家成立于2019年的美国VPS商家,主营美国洛杉矶、芝加哥、达拉斯、新泽西、西雅图机房的VPS、邮件服务器和托管独立服务器业务。georgedatacenter的VPS采用KVM和VMware虚拟化,可以选择windows...

数脉科技香港自营,10Mbps CN2物理机420元/月

数脉科技怎么样?数脉科技品牌创办于2019,由一家从2012年开始从事idc行业的商家创办,目前主营产品是香港服务器,线路有阿里云线路和自营CN2线路,均为中国大陆直连带宽,适合建站及运行各种负载较高的项目,同时支持人民币、台币、美元等结算,提供支付宝、微信、PayPal付款方式。本次数脉科技给发来了新的7月促销活动,CN2+BGP线路的香港服务器,带宽10m起,配置E3-16G-30M-3IP,...

HostYun(22元/月)全场88折优惠香港原生IP大带宽

在之前的一些文章中有提到HostYun商家的信息,这个商家源头是比较老的,这两年有更换新的品牌域名。在陆续的有新增机房,价格上还是走的低价格路线,所以平时的折扣力度已经是比较低的。在前面我也有介绍到提供九折优惠,这个品牌商家就是走的低价量大为主。中秋节即将到,商家也有推出稍微更低的88折。全场88折优惠码:moon88这里,整理部分HostYun商家的套餐。所有的价格目前都是原价,我们需要用折扣码...

ssl连接为你推荐
免费送q币活动免费送q币送钻的活动聚酯纤维和棉哪个好聚酯纤维和纯棉的相比,哪个好?电脑杀毒软件哪个好电脑什么杀毒软件最好手动挡和自动挡哪个好自动挡手动挡哪个好?手机杀毒软件哪个好手机安全杀毒软件哪个比较好些?网络机顶盒哪个好什么牌子的网络机顶盒最好qq空间登录网页版网页版QQ怎么登陆yy空间登录怎么搞YY空间便宜的反义词便宜的反义词是什么呢哪个快递最便宜什么快递最便宜
域名劫持 vps是什么 国外vps 淘宝抢红包攻略 星星海 国外服务器网站 地址大全 台湾谷歌网址 合肥鹏博士 165邮箱 傲盾官网 万网主机管理 个人免费邮箱 alexa世界排名 web服务器 侦探online 美国西雅图独立 cdn免备案空间 卡巴斯基官方下载 西安电信测速网 更多