知识大全 用JSSE定制SSL连接

Posted 文件

篇首语:于高山之巅,方见大河奔涌;于群峰之上,更觉长风浩荡。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 用JSSE定制SSL连接相关的知识,希望对你有一定的参考价值。

用JSSE定制SSL连接  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  JSSE(Java Security Socket Extension Java安全套接字扩展)是Sun为了解决在Internet上的安全通讯而推出的解决方案 它实现了SSL和TSL(传输层安全)协议 在JSSE中包含了数据加密 服务器验证 消息完整性和客户端验证等技术 通过使用JSSE 开发人员可以在客户机和服务器之间通过TCP/IP协议安全地传输数据 这篇文章主要描述如何使用JSSE接口来控制SSL连接   首先我通过一个简单的客户机/服务器程序来介绍如何利用JSSE进行编程 当建立客户端时 我们需要配置KeyStore和TrustStore文件 这样在程序中我们才可以从客户端的文件系统中加载它们 然后文章将讨论授权和身份验证方面的问题 通过从KeyStore中选择不同的授权 客户端程序可以连接到不同的服务器   运行例子程序  下载例子程序   在运行JSSE程序前 你需要正确安装JSSE 如果你安装了J SE JSSE已经被自动安装并配置好了 如果你使用的是其他版本的Java 你需要从官方站点上下载并安装JSSE 安装过程这里就不再赘述 由于JSSE是在J SE 中才成为标准的 并且J SE 中的JSSE和以前的JSSE有一些细微的差别 而且文中的例子都是在J SE 下调试的 因此推荐你使用J SE 运行这些例子     在深入介绍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 cer  keytool import alias alice keystore serverTrust file alice cer  keytool import alias bob keystore serverTrust file bob cer  到目前为止 在当前目录下包含clientKeys serverKeys clientTrust serverTrust四个文件 完成了KeyStore和TrustStore的设置后就可以运行例子程序了 首先需要运行服务器程序   java ssl keyStore=serverKeys    ssl keyStorePassword=password    ssl trustStore=serverTrust    ssl trustStorePassword=password SimpleSSLServer  在命令行中我们指定了keyStore属性为serverKeys 由于服务器程序需要获得客户端的授权信息 我们指定trustStore为serverTrust 这样SSLSimpleServer就可以验证由SSLSimpleClient提供的授权信息 当服务器程序成功运行后 你会看到下面的提示   SimpleSSLServer running on port   这时候服务器会等待客户端发出建立连接的申请 如果你希望在另一个端口上运行服务器程序 可以在命令中指定 port xxx参数 其中xxx是端口号     然后在另一个命令窗口中运行客户端程序     java ssl keyStore=clientKeys    ssl keyStorePassword=password    ssl trustStore=clientTrust    ssl trustStorePassword=password SimpleSSLClient  客户端程序会试图向本机的 端口建立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    X Certificate    cert=(X Certificate)event getPeerCertificates()[ ];   String peer=cert getSubjectDN() getName();   System out println(ident+ : Request from +peer);      catch (SSLPeerUnverifiedException pue)    System out println(ident+ : Peer cha138/Article/program/Java/JSP/201311/19512

相关参考

知识大全 联通定制版和全网通的区别

联通定制版和全网通什么区别全网通4g版可以用移动联通电信号码全部都可以用4g信号,非4g版这些号码放进去也都可以用2g信号;联通定制版4g只有联通号码才能达到4g,移动号码只能用2g信号,且不能用电信

知识大全 用定制标签库和配置文件实现对JSP页面元素的访问控制

用定制标签库和配置文件实现对JSP页面元素的访问控制  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 英雄联盟一到连接界面就黑屏,之后闪退,怎么回事

英雄联盟一到连接界面就黑屏,之后闪退,怎么回事1:ie右键-属性-高级找使用ssl2.0打勾即三:载网游加速器2:右击网邻居-属性-右击宽带连接-属性-网络-inter协议版本4(TCP/IPV4)-

知识大全 三星GT-i9050怎么刷机。移动定制。用一键刷机还是官方rom

三星GT-i9050怎么刷机。移动定制。用一键刷机还是官方rom?怎么刷?  以下文字资料是由(本站网www.cha138.com)小编为大家搜集整理后发布的内容,让我们

知识大全 移动定制机与非定制机有什么区别

移动定制机与非定制机有什么区别?移动定制的机器与大陆行货除了软件没有什么不同之处.移动定制手机就是集成了各种移动的收费服务,如果你想用倒是很方便。可惜大部分用户都用不着,倒是时不时不小心就上网,花钱,

知识大全 Apache、SSL、MySQL和PHP平滑无缝地安装

Apache、SSL、MySQL和PHP平滑无缝地安装  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 tomcat5.0下配置ssl

使用java版本 设置环境变量 PATH=/usr/jsdk/bin JAVA_HOME=/usr/jsdk/ CLASSPATH=/usr/jsdk/lib/

知识大全 OPENBSD-3.8上快速部署apache+mysql+php+ssl[3]

OPENBSD-3.8上快速部署apache+mysql+php+ssl[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,

知识大全 OPENBSD-3.8上快速部署apache+mysql+php+ssl[2]

OPENBSD-3.8上快速部署apache+mysql+php+ssl[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,

知识大全 OPENBSD-3.8上快速部署apache+mysql+php+ssl[1]

OPENBSD-3.8上快速部署apache+mysql+php+ssl[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,