- 浏览: 293129 次
文章分类
- 全部博客 (148)
- Shell (2)
- Python (4)
- Java (31)
- Javascript (4)
- Android (7)
- SQL优化 (0)
- Linux (5)
- webOS (4)
- MySQL (18)
- memcach redis (1)
- memcach (0)
- redis (3)
- memcache (2)
- svn (1)
- UED (1)
- 网络 (1)
- virtual box (1)
- git (1)
- Gitosis (1)
- 云计算 (2)
- 12306 (1)
- google (1)
- spdy (1)
- nginx (1)
- tomcat (2)
- SSL (2)
- lucene (2)
- 空间搜索 (1)
- lzo (1)
- 数据压缩 (1)
- ios (1)
- maven (1)
- elasticsearch (1)
- scribe (1)
- flume (1)
- jni (1)
- jna (1)
- hadoop (2)
- 大数据 (1)
最新评论
-
aa80303857:
不错,学习了。互相关注一下。
Sitemesh学习笔记 -
xiaozang:
...
关于nginx的rewrite重写规则 -
coderuncle:
楼主有没有研究过cloudera flume和apache f ...
scribe,flume -
奔跑的犀牛:
...
linux下自动启动mysql -
lsn_1212:
网上装svn的资源太多了,这个挺好的,说的挺全的。
SVN Server安装部署攻略(Linux+SubVersion+Apache)
本文通过模拟场景,介绍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编码
默认的情况下,我认为读者已经对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编码
发表评论
-
Spring发送邮件。
2013-06-04 15:15 1186Spring邮件抽象层的主要包为org.springfram ... -
JNA—JNI终结者
2013-03-04 14:08 1428JNA— http://blog.csdn.n ... -
Java 压缩实现
2013-01-29 10:51 1046Java压缩技术(一) ZLib Java压缩技术(二) ZI ... -
深入理解JVM内幕:从基本结构到Java 7新特性
2013-01-26 22:57 879原文链接 http://www.importnew.com/ ... -
使用logback轻松管理日志
2013-01-22 14:12 2284最近才开始在项目中使用logback,有一种相见恨晚的感觉, ... -
TOMCAT-SSL双向认证-配置实例
2013-01-09 13:54 1122SSL (Secure Socket Layer - 安全套接 ... -
Java入门-简单的RMI示例
2012-12-06 11:11 1244RMI是一种分布式技术,使用RMI可以让一个虚拟机上的应 ... -
Java入门-BitSet的使用
2012-12-06 11:01 9498在使用PAT-Tree的中文实现中需要用到大量的位运算, ... -
由12306.cn谈谈网站性能技术
2012-10-17 16:35 96612306.cn网站挂了,被 ... -
Server redirected too many times
2012-09-17 16:54 6052我之前遇到过这种问题,有些网站是这样的,他判断cooki ... -
java并发编程
2012-08-15 19:45 0Queue BlockingQueue Con ... -
在junit中使用open session in view
2012-08-07 11:22 2106废话不多说直接上代码: jpa的 import ... -
mvn指定项目名称
2012-06-07 17:10 988call mvn eclipse:clean eclipse: ... -
在JVM关闭前想做的操作Rumtime
2011-12-01 11:07 1106在虚拟机被关闭前想做一些收尾工作,可以使用 Runtim ... -
Apache和Subversion集成安装与配置
2011-08-12 17:30 1178要准备的东西如下:1,apac ... -
Nginx+tomcat 做负载均衡
2011-08-12 17:27 1385一、 1、将tomcat 的serv ... -
SVN Server安装部署攻略(Linux+SubVersion+Apache)
2011-07-18 18:45 2740一. 安装apr依赖库(Apache Po ... -
git
2011-05-26 11:38 12641. git init 2. cd - 快速返回 3 ... -
java工具集合
2011-05-23 17:29 895code review gerrit g ... -
常用的comet框架
2011-05-20 11:46 1377Atmosphere pushlet DWR comet ...
相关推荐
实现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协议安全地传输数据