- 浏览: 864061 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (280)
- java相关 (29)
- linux系统 (55)
- ipsec (0)
- ssl (3)
- 信息安全 (13)
- web相关 (35)
- windows (9)
- c,c++ (14)
- log4j (3)
- hibernate (8)
- sqlite (1)
- 程序人生 (2)
- js (2)
- 生活点滴 (3)
- 网络相关 (14)
- 问题积累 (15)
- 数据库相关 (27)
- 软件测试 (2)
- PKI相关 (2)
- 程序设计 (7)
- 犄角旮旯 (0)
- 杂七杂八 (0)
- 硬件相关 (14)
- 防火墙 (2)
- 电子商务 (2)
- 多媒体相关 (1)
- 内存管理 (4)
- 面向对象 (1)
- csp (1)
- 驱动开发 (3)
- 移动开发 (2)
- openssl多线程实例 (1)
最新评论
-
xiaoyao3857:
博主很有探索精神嘛,学习了
Linux主机名Hostname详解 -
hiskyrisa:
言简意赅,好文章。
Flex是什么 -
layznet:
犯了类似错误。使用的是derby数据库。driverClass ...
java.sql.SQLException: No suitable driver -
idision:
你好,文章有一句createSubjectKeyId(keyT ...
bouncycastle 产生证书 -
zheng12tian:
代码有全的不?只贴一部分,,,,
在LOG4J中把日志写入远程数据库
本文通过模拟场景,介绍SSL双向认证的java
实
现
默认的情况下,我认为读者已经对SSL原理有一定的了解,所以文
章
中对SSL的原理,不做详细的介绍。
如果有这个需要,那么通过GOOGLE,可以搜索到很多这样的文章。
模
拟场景:
Server端和Client端通信,需要进行授权和身份的验证,即Client只能接受Server的消息,Server只能接受
Client的消息。
实现技术:
JSSE(Java Security Socket Extension)
是
Sun为了解决在Internet上的安全通讯而推出的解决方案。它实现了SSL和TSL(传输层安全)协议。在JSSE中包含了数据加密,服务器验证,
消息完整性和客户端验证等技术。通过使用JSSE,开发人员可以在客户机和服务器之间通过TCP/IP协议安全地传输数据
为了实现消息认
证。
Server需要:
1)KeyStore: 其中保存服务端的私钥
2)Trust
KeyStore:其中保存客户端的授权证书
同样,Client需要:
1)KeyStore:其中保存客户端的私钥
2)Trust
KeyStore:其中保存服务端的授权证书
我们可以使用Java自带的keytool命令,去生成这样信息文件
1)生成服务
端私钥,并且导入到服务端KeyStore文件中
keytool -genkey -alias serverkey -keystore
kserver.keystore
过程中,分别需要填写,根据需求自己设置就行
keystore密码:123456
名字和姓
氏:stone
组织单位名称:eulic
组织名称:eulic
城市或区域名称:HZ
州或省份名称:ZJ
国家代
码:CN
serverkey私钥的密码,不填写和keystore的密码一致:123456
就可以生成kserver.keystore
文件
server.keystore是给服务端用的,其中保存着自己的私钥
2)根据私钥,导出服务端证书
keytool
-export -alias serverkey -keystore kserver.keystore -file server.crt
server.crt
就是服务端的证书
3)将服务端证书,导入到客户端的Trust KeyStore中
keytool -import
-alias serverkey -file server.crt -keystore tclient.keystore
tclient.keystore
是给客户端用的,其中保存着受信任的证书
采用同样的方法,生成客户端的私钥,客户端的证书,并且导入到服务端的Trust
KeyStore中
1)keytool -genkey -alias clientkey -keystore
kclient.keystore
2)keytool -export -alias clientkey -keystore
kclient.keystore -file client.crt
3)keytool -import -alias clientkey
-file client.crt -keystore tserver.keystore
如此一来,生成的文件分成两组
服务端
保存:kserver.keystore tserver.keystore
客户端保存:kclient.keystore
tclient.kyestore
接下来,就采用JSSE,分别生成SSLServerSocket,SSLSocket
服
务端,生成SSLServerSocket代码
SSLContext ctx =
SSLContext.getInstance("SSL");
KeyManagerFactory kmf =
KeyManagerFactory.getInstance("SunX509");
TrustManagerFactory tmf =
TrustManagerFactory.getInstance("SunX509");
KeyStore ks =
KeyStore.getInstance("JKS");
KeyStore tks =
KeyStore.getInstance("JKS");
ks.load(new
FileInputStream("data/kserver.keystore"),
SERVER_KEY_STORE_PASSWORD.toCharArray());
tks.load(new
FileInputStream("data/tserver.keystore"),
SERVER_TRUST_KEY_STORE_PASSWORD.toCharArray());
kmf.init(ks,
SERVER_KEY_STORE_PASSWORD.toCharArray());
tmf.init(tks);
ctx.init(kmf.getKeyManagers(),
tmf.getTrustManagers(), null);
return (SSLServerSocket)
ctx.getServerSocketFactory().createServerSocket(DEFAULT_PORT);
客户
端,生成SSLSocket的代码,大同小异
SSLContext ctx = SSLContext.getInstance("SSL");
KeyManagerFactory
kmf = KeyManagerFactory.getInstance("SunX509");
TrustManagerFactory
tmf = TrustManagerFactory.getInstance("SunX509");
KeyStore ks =
KeyStore.getInstance("JKS");
KeyStore tks =
KeyStore.getInstance("JKS");
ks.load(new
FileInputStream("data/kclient.keystore"),
CLIENT_KEY_STORE_PASSWORD.toCharArray());
tks.load(new
FileInputStream("data/tclient.keystore"),
CLIENT_TRUST_KEY_STORE_PASSWORD.toCharArray());
kmf.init(ks,
CLIENT_KEY_STORE_PASSWORD.toCharArray());
tmf.init(tks);
ctx.init(kmf.getKeyManagers(),
tmf.getTrustManagers(), null);
return (SSLSocket)
ctx.getSocketFactory().createSocket(DEFAULT_HOST, DEFAULT_PORT);
如
此,就完成了服务端和客户端之间的基于身份认证的交互。
client采用kclient.keystore中的clientkey私钥进
行数据加密,发送给server
server采用tserver.keystore中的client.crt证书(包含了clientkey的公
钥)对数据解密,如果解密成功,证明消息来自client,进行逻辑处理
server采用kserver.keystore中的
serverkey私钥进行数据叫米,发送给client
client采用tclient.keystore中的server.crt证书(包含
了serverkey的公钥)对数据解密,如果解密成功,证明消息来自server,进行逻辑处理
如果过程中,解密失败,那么证明消息来
源错误。不进行逻辑处理。这样就完成了双向的身份认证。
下面我附上简单的SSLServer.java
SSLClient.java,供大家演示用。
启动服务端的时候,大家不妨采用telnet 127.0.0.1
7777连接,看看能不能实现消息传递。
ssl demo
备注:
demo是采用maven构建项目的
demo文
件的编码是用utf8,为了避免中文乱码,请把workspace设置成utf8编码
posted on 2007-12-20
14:04 stone2083 阅读(2658) 评论(7) 编辑 收藏 所属分类: java
Feedback
# re:
SSL双向认证java实现 2008-01-05 22:37 jzp
不错,正需要.以后多些文章分享,辛苦了. 回复
更多评论
# re: SSL双向认证java实现 2008-04-18 11:41 wangpeng
我用你的方法试
了,的确可以实现ssl加密传输,但是我重新生成客户端证书后,并没有加载到服务器端的信任库tserver.keystore中,但是仍然可以通讯,这
样就是我随便生成个客户端证书只要有服务器的证书就可以通讯了,没有真正意义上达到双向认证,如何解决这个问题,请指教 回复 更多评论
#
re: SSL双向认证java实现 2008-04-18 11:43 wangpeng
我的msn是
steve_king211@msn.com,希望加上我,请教一些问题 回复 更多评论
# re: SSL双向认证java实现
2008-04-20 17:18 stone2083
谢谢wangpeng朋友,找到上原先demo中的一个问题。
因为在
Server端程序中,初始化的SSLServreSocket
serverSocket = (SSLServerSocket)
ctx.getServerSocketFactory().createServerSocket(DEFAULT_PORT);
少写了条语
句:serverSocket.setNeedClientAuth(true); //表明需要验证客户端的身份。
由于原demo程
序,不需要客户端身份验证,所以即使服务端没有客户端证书,也能完成通讯。
受限于自己对jsse理解非常的浅,上面的文章仅仅是覆盖了
jsse很表层的内容。
推荐ibm网站上的一篇文章,对jsse和ssl写得很深入浅出。
为高级 JSSE 开发人员定制
:http://www.ibm.com/developerworks/cn/java/j-customssl/
如有问题,欢迎再交
流 :)
回复 更多评论
# re: SSL双向认证java实现 2008-07-10 20:56 JessonWoo
请
问单向认证,即客户端对服务器端的认证,需要为客户端配置证书吗,
具体用java如何实现查看服务器端证书的功能,
盼高手赐教!
回复 更多评论
# re: SSL双向认证java实现 2008-07-14 13:21 stone2083
@JessonWoo
hi,
首先申明下,我自己对ssl的认识还是很肤浅的,仅仅上次和cnnic合作的时候,为了了解安全性问题,才被迫稍微看了相应的一些知识.
所
谓认证,是要对某台(当然可以是集群)服务器身份做认证.
认证方式有两种:
自签名认证:服务端生成key,然后根据key导出证书.公布
于站点.
通过第三方认证机构认证:有服务端生成key,然后导出认证信息,交由天威诚信等第三方认证机构认证,最后生成证书,公布于站点.
客
户端,将证书下载,确认为可信任公司认证信息,并且导入到受信任区(trustscore),建立连接与服务端进行正常交互.至此,就完成了对服务端的认
证.
所以客户端必须将证书导入信任区.
java中,可以查看证书:
写个简单的方法:
FileInputStream
fis = new FileInputStream("cert.cer");
CertificateFactory
cf=CertificateFactory.getInstance("X509");
X509Certificate
c=(X509Certificate) cf.generateCertificate(fis);
System.out.println(c.getSubjectDN());
//
可以查看下X509Certificate的一些get方法.
其实keytool仅仅是jdk中的工具.
openssl是更常用
的一个工具
发表评论
-
关于Bad version number in .class file的问题
2010-11-15 14:20 1000关于Bad version number in .class ... -
一个获取文件crc32校验码的简洁的java类
2010-05-12 19:48 3273从jdk1.4开始,java核心包里已经提供对crc计算的支持 ... -
Windows下Apache与Tomcat的整合
2010-05-12 13:52 1077为了完成这个任务,在 ... -
java.util.ResourceBundle 使用详解
2010-04-28 19:39 853一、认识国际化资源文件 这个类提供软件国际化的捷 ... -
基于JAAS实现登录
2010-04-25 22:11 1261JAAS:Java Authentication and ... -
什么是JAAS,以及灵活的Java安全机制
2010-04-25 22:05 1888今天在论坛上看到JASS,不清楚是什么呢,网上找了一下,受益良 ... -
Java插件技术
2010-04-25 21:31 21451.Java插件技术 Java插件技术(Java Plu ... -
java RMI的例子(转)
2010-04-25 21:11 949参考别人的程序后写了个自己的RMI 程序RMI ,远程方法 ... -
Java安全通信、数字证书及应用实践(转)
2010-04-21 21:05 1673摘要 : 在本文 ... -
Eclips 内存溢出
2010-04-13 16:26 1041在Eclipse 根目录下找到eclipse .ini ... -
Eclipse 启动不起来异常:JVM terminated. Exit code=-1
2010-04-11 10:09 7458Eclipse 启动不起来,出现以下错误: ... -
Java程序员需要了解的几个开源协议介绍
2009-12-21 21:32 1118介绍几个比较常见的开 ... -
apache lucene介绍
2009-12-15 09:16 1948什么是lucene Apache Lucene是一个开放源程序 ... -
Java基础:Java中堆内存与栈内存分配浅析
2009-08-11 20:19 1347Java 把内存划分成两种:一种是栈内存,另一种是堆内存 ... -
对synchronized(this)的一些理解
2009-07-23 10:21 1174一、当两个并发线程访问同一个对象object中的这个synch ... -
Linux下JNI调用
2009-07-09 12:43 1459整个实现过程可以分为五步来完成: 1)写一个声明了nativ ... -
如何在Java中执行其它程序
2009-07-09 12:42 2305在编写Java程序时,有时 ... -
linux下jdk的安装与卸载
2009-07-06 10:46 2103下面是卸载步骤: 用ro ... -
JNI技术小试
2009-06-23 14:28 1232目前 java 与 dll 交互的技术主要有 ... -
java.util.Date和java.sql.Date的区别及应用
2009-06-21 14:35 1135java.util.Date 就是在除了SQL语句的情况下面使 ...
相关推荐
实现Java SSL双向认证通常涉及以下几个步骤: 1. **生成密钥库(KeyStore)**: - 服务器端需要一个KeyStore,存储其私钥,通常使用`keytool`命令生成,例如:`keytool -genkey -alias serverkey -keystore ...
本篇将深入探讨如何使用Java实现SSL/TLS双向认证,以及涉及到的相关工具和步骤。 首先,让我们理解什么是SSL/TLS双向认证。通常,SSL/TLS连接采用单向认证,即服务器验证客户端的身份,而客户端不需要验证服务器。...
java实现_SSL双向认证,里面详细介绍怎样实现,还包括完整的实现代码,直接可用
在这个场景中,我们讨论的是如何在Java中设置和实现SSL套接字的双向认证。双向认证通常在高安全性环境中使用,例如银行、政府机构或企业内部网络,因为它们需要确保通信双方都是可信的。 首先,为了实现双向认证,...
在实现Java SSL双向认证的过程中,主要涉及到以下几个关键概念: 1. **KeyStore**:KeyStore是Java中存储密钥和证书的容器,对于服务器端,KeyStore保存着服务器的私钥和证书;对于客户端,KeyStore则保存着客户端...
下面将详细介绍Java实现SSL双向认证的步骤、关键概念和技术要点。 1. **生成证书**: - 服务器证书:首先,你需要为服务器生成一个自我签名的证书,这可以通过Java的keytool工具完成。创建一个Key Pair(公钥和...
Tomcat 实现 SSL 双向认证 Tomcat 是一个流行的开源 Web 应用服务器,而 SSL(Secure Sockets Layer)是一种常用的安全协议,用于确保 Web 应用程序之间的数据传输安全。本文将详细介绍如何在 Tomcat 中实现 SSL ...
在这个场景中,我们将深入探讨如何在Java工程中使用ActiveMQ实现SSL双向认证连接。 首先,让我们了解SSL双向认证的基本概念。在传统的SSL单向认证中,客户端只需要验证服务器的身份,而服务器无需验证客户端。而在...
SSL双向认证证书制作过程主要涉及网络安全领域,尤其是用于保护网络通信的安全套接层(SSL)和传输层安全(TLS)协议。这些协议确保了数据在互联网上传输时的加密和完整性,防止中间人攻击和数据泄露。以下是SSL双向...
在Netty中实现SSL双向认证,我们需要以下步骤: 1. **生成证书**:首先,为服务器和客户端分别生成数字证书。这通常包括创建私钥和公钥,然后使用证书签名请求(CSR)将公钥提交给受信任的证书颁发机构(CA)进行...
本篇文章将深入探讨如何在Android应用中实现对自签CA的HTTPS SSL双向认证,并且这些实现方法同样适用于Java SE(J2SE)环境。 首先,我们需要了解HTTPS的基本原理。HTTPS是HTTP协议的安全版本,它通过SSL/TLS协议来...
以下是对SSL双向认证的详细配置进行的总结。 **一、SSL简介** SSL是为网络通信提供安全及数据完整性的一种安全协议,通过加密传输数据,防止中间人攻击和窃听。其升级版TLS(Transport Layer Security)在当前的...
在SSL双向认证中,不仅服务器需要验证客户端的身份,客户端也需要验证服务器的身份,从而提供了更高级别的安全保护。这种模式通常在银行、企业内部网络或高度敏感的信息交换中使用。 在SSL双向认证中,涉及的主要...
以下是实现Tomcat下SSL双向认证的步骤: 1. **生成证书**: - 服务器证书:需要创建一个自签名的服务器证书,或者从权威的证书颁发机构(CA)获取。 - 客户端证书:同样需要为每个客户端生成一个证书,并分发给...
SSL Socket 双向认证实现技术:JSSE(Java Security Socket Extension),它实现了 SSL 和 TSL(传输层安全)协议。在 JSSE 中包含了数据加密,服务器验证,消息完整性和客户端验证等技术。通过使用 JSSE,可以在...
Java环境中配置SSL双向认证是一项确保网络通信安全的重要技术,尤其在处理敏感数据传输时更为关键。SSL(Secure Sockets Layer)是一种网络安全协议,用于在互联网上建立加密连接,确保数据在传输过程中不被窃取或...
在Java客户端和VC(Visual C++)服务器之间实现SSL双向认证涉及以下几个关键步骤: 1. **证书准备**: - **服务器证书**:服务器需要一个由受信任的证书颁发机构(CA)签发的数字证书,包含服务器的公钥和身份信息...
是Sun为了解决在Internet上的实现...它实现了SSL和TSL(传输层安全)协议。在JSSE中包含了数据加密,服务器验证,消息完整性和客户端验证等技术。通过使用JSSE,可以在Client和Server之间通过TCP/IP协议安全地传输数据