随着互连网的规模与影响不断扩大,网络通信安全已成为网络程序设计时,需要重点考虑的问题。
SSL(Server Socket Layer)服务套接字层,是Netscape(网景)公司提出的用于internet上安全保密传输信息的协
议,它工作于OSI开放系统互连模型的传输层之上,因此在传输层之上的协议,比如http,ftp,smtp等,都可以基
于ssl实现安全的网络通信。
最近做MCS平台项目,需要实现应用程序平台到MCS平台的安全通信,做了有一阵子,小结一下。
原理:
要想保证网络通信的安全,我们第一反应就是给传输的数据加密,这也是现行安全传输通用的模式。但在传统加
密方式(单密钥,对称加密)下,密钥不可避免的要被传送于网络节点之间,(除非是写死到各个节点中,不过那样
就没有任何灵活性和普适性),在一定强度的网络攻击下,这种加密方式是很脆弱的。
SSL的出现解决了这个难题,理解SSL的关键是理解非对称加密的含义。
在对称加密的情况下,源数据A,通过使用密钥B,加密成为密文C。任何人,只要获得了密钥B,就能够对截获
的密文C解密,还原出源数据A。(依靠"算法安全"远不如依靠"密钥安全");在非对称加密中,出现了“密钥对”
的概念,即有一个公共密钥(公钥)和一个私有密钥(私钥),经公钥加密的密文只能由私钥解密,反过来,经私钥
加密的密文只能由公钥解密。这是个重要的特性(数学原理可参考RSA算法),下面的模拟https通信流程说明了这
一特性的重要。
1,客户端向服务端发出请求,服务端将公钥(以及服务端证书)响应给客户端;
2,客户端接收到服务器端端公钥与证书,验证证书是否在信任域内,不信任则结束通信,信任则使用服务端传
过来的公钥生成一个“预备主密码”,返回给服务端。
3,服务端接收客户端传过来的“预备主密码”密文,使用私钥解密。非对称加密的安全性也就在于此了,第三
方无法获取到“预备主密码”的明文,因为除了服务端,其他任何人是没有私钥的。
4,双方使用“预备主密码”生成用于会话的“主密码”。确认后,结束本次SSL握手,停止使用非对称加密。
5,双方使用“主密码”对称加密传输数据,直到本次会话结束。
总结整个流程:先采用非对称加密模式,保证“主密码”只被通信双方获知,而后使用传统的对称加密方式
通信,这样,保证了密钥安全(即“主密码”)就等于保证了数据安全。之所以建立安全连接后,转而使用对称加
密,是因为非对称加密的运算量很大,用于“常态”的数据通信十分低效。
以上描述的仅是SSL协议中加密通信的原理,没有涉及到证书验证,以及客户端,服务端模式。
实现:
JDK里面自带了一个密钥生成工具keytool,可以通过它生成SSL通信需要的密钥对,或者生成自签名的证书。
所有密钥对或者签名证书都是存放在“keystore”密钥仓库中,由它来管理。
下面结合具体例子说明:(java WEB容器:tomcat 5.5)
1,生成服务端密钥仓库,
keytool -genkey -alias svrkey -keyalg RSA -keystore d:\svr.jks -validity 365
"alias"是生成的密钥别名,密钥的导入导出都需要由别名来定位。
"keystore"生成的密钥仓库
"validity"生成密钥仓库的有效期(天)
随后会要求输入密钥仓库入口密码,比如: lostsky_11
输完密码后,接着会要求一系列的输入,无非是单位,所在地区之类的信息,
但是第一项很重要!为输入服务端域名或IP,如: 192.168.1.3或www.591pic.com
必须与服务器域名或IP相同,否则SSL连接无法建立(这也是SSL通信验证的一部分)
2,在tomcat_home/conf/server.xml中配置:
找到ssl通信配置那一段,加入:
keystoreFile="d:\svr.jks" keystorePass="lostsky_11"
服务器启动时会从中寻找用于建立ssl连接的密钥
3,导出服务端证书
keytool -export -alias svrkey -file d:\svr.cer -keystore d:\svr.jks
"alias"为想导出的密钥的别名,"file"为导出的证书,"keystore"为存储着导出密钥的仓库
4,生成客户端密钥仓库
keytool -genkey -alias clientkey -keyalg RSA -keystore d:\client.jks
会要求输入仓库密码:如:midsky
5,将服务端证书导入到客户端密钥仓库
keytool -import -file d:\svr.cer -keystore d:\client.jks
会要求输入客户端密钥仓库的密码:如上是:midsky
这样服务端的密钥仓库就在tomcat部署完毕了,
6,在客户端,每次访问服务端之前,加入
"System.setProperty("javax.net.ssl.trustStore","d:\\client.jks");
System.setProperty("javax.net.ssl.trustStorePassword","midsky");
"
就把服务端证书添加到了客户端的信任域中,能够完成ssl通信。
注:ssl通信主要验证三个方面:
a, 证书是否可信(第6步)
b, 证书是否过期(第1步:validity)
c, 证书地址是否和当前访问地址符合(第1步)
客户端添加信任域还有编程的动态方法,但是那样会降低通信的安全性,对于证书相对固定的服务,不建议使
用。
以上是客户端对于服务端的验证,这也是SSL默认的实现方式。在这种方式下,每次通信时,发起请求方(如PC
中的BROWSER)都会验证响应方(如某个WEB服务端)的证书是否在己方信任域中,对方的证书是否过期,对方
的域名或IP,是否与信任域中证书记载的一致;不符合其中任何一项,通信都会被拒绝。但反过来,响应方是不
对请求方做任何验证的。所以有些需要双向验证的服务(比如某些服务只能对特定的拥有证书的用户开放),就需
要添加客户端证书,由服务端来验证了,原理和实现与默认模式类似。
分享到:
相关推荐
Java 实现基于 SSL 的 HTTP 通道 本文主要讲解了 Java 语言实现基于 SSL 的 HTTP 通道的原理和实践,包括 SSL 协议的介绍、非对称加密的原理、SSL 握手流程的分析,以及 Java 语言中使用 Keytool 工具生成密钥对和...
本篇将深入探讨如何使用Java实现SSL/TLS双向认证,以及涉及到的相关工具和步骤。 首先,让我们理解什么是SSL/TLS双向认证。通常,SSL/TLS连接采用单向认证,即服务器验证客户端的身份,而客户端不需要验证服务器。...
在Java编程语言中,SSLSocket(Secure Sockets Layer Socket)是用于实现安全网络通信的重要组件,它基于SSL/TLS协议栈,为应用程序提供加密的数据传输服务。本教程将深入探讨Java中的SSLSocket应用,包括其基本概念...
### 基于Java2的身份认证数字签名和SSL实现技术 #### Java2平台下的安全模型概览 在探讨Java2平台下实现身份认证、数字签名和SSL的技术细节之前,我们首先需要理解Java2平台所提供的一系列安全框架和工具。Java2...
Java平台提供了对SSL/TLS协议的支持,使得开发者能够构建安全的HTTPS服务或者实现其他基于SSL/TLS的应用。 在Java中,SSL/TLS主要通过JSSE(Java Secure Socket Extension)来实现。JSSE是Java平台的一部分,它为...
本资源包含的是一些基于Java实现SSL和HTTPS协议的实际代码示例,帮助开发者更好地理解和应用这些技术。 SSL协议主要用于在客户端和服务器之间建立安全的通道,通过加密通信数据,防止数据在传输过程中被窃取或篡改...
本文详细介绍了基于口令的...整个系统采用JAVA语言对SSL协议、DES、MD5的支持设计实现的,具有设计简练、认证灵活、安全性能可靠、成本低廉等优点,能很好地解决各类企事业单位的用户身份鉴别和传输文件的机密性问题。
本项目基于SSL(Secure Socket Layer)协议的FTP文件传输系统设计与开发,旨在提供一个安全、可靠的文件传输解决方案。SSL协议能够为FTP连接提供加密和身份验证,确保数据在传输过程中的隐私和完整性。 FTP文件传输...
MyEclipse是基于Eclipse的Java集成开发环境,它提供了丰富的功能,如代码编辑、调试、构建、部署等,大大简化了开发过程。在本项目中,MyEclipse 8.6被用来编写、测试和管理Java代码。 P2P聊天系统的架构通常包括...
在Java编程环境中,SSL(Secure Socket Layer)和其升级版TLS(Transport Layer Security)协议是用于实现安全网络通信的关键技术。这些协议确保了数据在互联网上的传输过程中是加密的,防止了中间人攻击和其他形式...
在Java编程中,HTTPS(Hypertext Transfer Protocol Secure)是一种基于HTTP协议的安全通信协议,用于在客户端和服务器之间建立安全的、加密的数据传输通道。它主要用于保护用户数据,防止中间人攻击和数据篡改。本...
本文详细介绍了如何利用Java实现基于TCP/IP的远程登录和文件传输功能。远程登录通过Telnet协议,利用Socket编程实现客户端与服务器之间的交互;文件传输通过FTP协议,利用`FTPClient`类或第三方库进行操作。在实际...
而Java作为广泛应用的编程语言,提供了丰富的API来支持SSL和HTTPS协议的实现。 1. SSL/TLS协议基础: SSL/TLS协议的主要目的是为网络通信提供加密处理,防止数据被第三方窃取或篡改。它通过握手协议建立安全连接,...
在Java编程环境下,我们可以利用Apache的mina库或者JSch库来实现基于SSL的FTP服务器。Apache Mina是一个高度可扩展且易于使用的网络应用框架,它支持多种协议,包括FTP。而JSch是Java对SSH2协议的实现,可以用来实现...
本文将深入探讨数字证书的基本概念,以及如何利用Java技术实现浏览器与服务器之间基于数字证书的安全通信,重点在于数字证书的签名和验证过程。 #### 数字证书及其重要性 数字证书是一种在网络上验证用户身份的...
本项目是利用Java技术实现的一款基于局域网的客户端/服务器(C/S)模式的聊天软件,允许用户进行文本交谈并能实现文件传输功能。 【描述】:“基于局域网的C/S模式的聊天工具,可以传文件” C/S架构是一种常见的...
1. **Socket编程**:Java中的Socket类是实现网络通信的基础,它提供了双向数据通道,用于客户端和服务器之间的连接。即时通讯系统的核心就是通过Socket建立可靠的连接,进行数据的收发。 2. **多线程**:为了处理多...
本主题聚焦于“基于JAVA实现文件传输”,这是一个核心的计算机网络和Java编程技术结合的话题。文件传输是网络通信中的基本操作,通过Java我们可以构建高效、安全的文件传输系统。下面将详细探讨这一领域的关键知识点...
在本项目中,我们主要探讨的是“基于JAVA的网络通讯系统设计与实现”。这个主题涵盖了Java编程语言在网络通信领域的应用,以及如何构建一个完整的网络通信系统。以下将详细阐述相关知识点: 1. **Java网络编程基础*...
【标题】:基于Chrome、Java、WebSocket、WebRTC实现浏览器视频通话 【正文】: 在当今互联网技术高速发展的时代,实时通信(Real-Time Communication,RTC)已成为用户需求的一部分,尤其是在远程工作、在线教育...