java中关于SSL/TSL的介绍和如何实现SSL Socket双向认证

一、        SSL概述

SSL协议采用数字证书及数字签名进行双端实体认证,用非对称加密算法进行密钥协商,用对称加密算法将数据加密后进行传输以保证数据的保密性,并且通过计算数字摘要来验证数据在传输过程中是否被篡改和伪造,从而为敏感数据的传输提供了一种安全保障手段。

SSL协议提供的服务主要有:

1)认证用户和服务器,确保数据发送到正确的客户机和服务器

认证用户和服务器的合法性,使它们能够确信数据将被发送到正确的客户机和服务器上。客户机和服务器都有各自的识别号,这些识别号由公开密钥进行编号,为验证用户是否合法,SSL协议要求在握手交换数据时进行数字认证,以此确保用户的合法性。

2)加密数据以防止数据中途被窃取

SSL协议所采用的加密技术既有对称密钥技术,也有公开密钥技术。在客户机和服务器进行数据交换前,交换SSL初始握手信息,在SSL握手信息中采用了各种加密技术对其进行加密,以保证其机密性和数据的完整性,并且用数字证书进行鉴别,这样就可以防止非法用户进行破译。

3)维护数据的完整性,确保数据在传输过程中不被改变

SSL协议采用Hash函数和机密共享的方法提供信息的完整性服务,建立客户机和服务器之间的安全通道,使所有经过SSL协议处理的业务在传输过程中能全部完整准确无误的到达目的地。

SSL体系结构:

SSL协议位于TCP/IP协议模型的网络层和应用层之间,使用TCP来提供一种可靠的端到端的安全服务,它是客户/服务器应用之间的通信不被攻击窃听,并且始终对服务器进行认证,还可以选择对客户进行认证。SSL体系结构如图1所示。

在SSL通讯中,首先采用非对称加密交换信息,使得服务器获得浏览器端提供的对称加密的密钥,然后利用该密钥进行通讯过程中信息的加密和解密。为了保证消息在传递过程中没有被篡改,可以加密HASH编码来确保信息的完整性。SSL通讯过程,如图2所示。

一般情况下,当客户端是保密信息的传递者时,客户端不需要数字证书验证自己身份的真实性,如电子银行的应用,客户需要将自己的账号和密码发送给银行,因此银行的服务器需要安装数字证书来表明自己身份的有效性。在某些应用中,服务器端也需要对客户端的身份进行验证,这时客户端也需要安装数字证书以保证通讯时服务器可以辨别出客户端的身份,验证过程类似于服务器身份的验证过程。

三、SSL Socket双向认证的实现

SSL Socket通信是对Socket通信的拓展。在Socket通信的基础上添加了一层安全性保护,提供了更高的安全性,包括身份验证、数据加密以及完整性验证。

SSL Socket双向认证实现技术: JSSE(Java Security Socket Extension),它实现了SSL和TSL(传输层安全)协议。在JSSE中包含了数据加密,服务器验证,消息完整性和客户端验证等技术。通过使用JSSE,可以在客户机和服务器之间通过TCP/IP协议安全地传输数据。为了实现消息认证:

服务器端需要:

1、KeyStore: 其中保存服务器端的私钥

2、Trust KeyStore: 其中保存客户端的授权证书

客户端需要:

1、KeyStore:其中保存客户端的私钥

2、Trust KeyStore:其中保存服务端的授权证书

密钥和授权证书的生成方法:

使用Java自带的keytool命令,在命令行生成。

1、生成服务器端私钥kserver.keystore文件

keytool -genkey -alias serverkey -validity 1 -keystore kserver.keystore

2、根据私钥,导出服务器端安全证书

keytool -export -alias serverkey -keystore kserver.keystore -file server.crt

3、将服务器端证书,导入到客户端的Trust KeyStore中

keytool -import -alias serverkey -file server.crt -keystore tclient.keystore

4、生成客户端私钥kclient.keystore文件

keytool -genkey -alias clientkey -validity 1  -keystore kclient.keystore

5、根据私钥,导出客户端安全证书

keytool -export -alias clientkey -keystore kclient.keystore -file client.crt

6、将客户端证书,导入到服务器端的Trust KeyStore中

keytool -import -alias clientkey -file client.crt -keystore tserver.keystore

生成的文件分成两组,服务器端保存:kserver.keystore tserver.keystore 客户端保存:kclient.keystore  tclient.kyestore(通常情况下,我们也可以将对方的证书导入自己存放私匙的keystore中)。

身份验证的原理

客户端采用自己的私钥进行数据加密,发送给服务端,服务器端采用客户端的公匙(client.crt证书中存在)对数据解密,如果解密成功,证明消息来自可信的客户端,进行逻辑处理;

同理,服务器端采用kserver.keystore中的私钥进行数据加密,发送给客户端,客户端采用tclient.keystore中的server.crt证书对数据解密,如果解密成功,证明消息来自可信的服务器端,进行逻辑处理。如果解密失败,那么证明消息来源错误。不进行逻辑处理。

SSL Socket双向认证的安全性:

(1)可以确保数据传送到正确的服务器端和客户端。

(2)可以防止消息传递过程中被窃取。

(3)防止消息在传递过程中被修改.。

在系统运行中可能出现以下情况:

(1)   服务器端、客户端都持有正确的密钥和安全证书,此时服务器端和客户端可以进行正常通信。

(2)   客户端的密钥和安全证书不正确,此时服务器端和客户端不可以进行正常通信。

(3)   客户端未持有密钥和安全证书,此时服务器端和客户端也不可以进行正常通信。

时间: 2024-12-11 00:58:51

java中关于SSL/TSL的介绍和如何实现SSL Socket双向认证的相关文章

关于Java中类名.class的基础介绍

声明:文章的总结,来自许多网友的优秀博客 关于通过类名访问class属性,我朋友过好几次了,一直没明白这个东西到底是什么?对此,我参照网友们的博客,总结了一些小知识,如发现错误,希望纠正,谢谢 其实任何一个类,都会有一个Class对象于这个类对应,在这个Class对象中,保存着实例化该类时所需要的基本信息,A.class  其实返回的是一个类A的Class对象,贴一个小代码演示一下: public class Test { /** * @param args */ public static v

Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等(转)

Java 中15种锁的介绍 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容如下: 公平锁 / 非公平锁 可重入锁 / 不可重入锁 独享锁 / 共享锁 互斥锁 / 读写锁 乐观锁 / 悲观锁 分段锁 偏向锁 / 轻量级锁 / 重量级锁 自旋锁 上面是很多锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性,有的指锁的设计,下面总结的内容是对每个锁的名词进行一定的解释. 公平锁 / 非公平锁 公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁. 非公

java中常见的rpc框架介绍

姓名:邓勇  班级:软件151 RPC是远程过程调用的简称,广泛应用在大规模分布式应用中,作用是有助于系统的垂直拆分,使系统更易拓展.Java中的RPC框架比较多,各有特色,广泛使用的有RMI.Hessian.Dubbo等.RPC还有一个特点就是能够跨语言,本文只以JAVA语言里的RPC为例. 其他的框架结构也类似,区别在于对象的序列化方法,传输对象的通讯协议,以及注册中心的管理与failover设计(利用zookeeper).客户端和服务端可以运行在不同的JVM中,Client只需要引入接口,

java中的各种锁详细介绍

转自:https://blog.csdn.net/axiaoboge/article/details/84335452 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率.本文旨在对锁相关源码(本文中的源码来自JDK 8).使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景. Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识.下面给出本文内容的总体分类目录: 1.

Android(java)学习笔记167:Java中操作文件的类介绍

1.File类:对硬盘上的文件和目录进行操作的类.    File类是文件和目录路径名抽象表现形式  构造函数:        1) File(String pathname)       Creates a new File instance by converting the given pathname string into an abstract pathname. 2)File(File parent, String child)       Creates a new File i

Java中的BigDecimal类用法介绍

Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高精度计算. 其中 BigInteger 类是针对大整数的处理类,而 BigDecimal 类则是针对大小数的处理类. BigDecimal 类的实现用到了 BigInteger类,不同的是 BigDecimal 加入了小数的概念. float和Double只能用来做科学计算或者是工程计算;在商业计算中,对数字精度要求较高,必须使用 BigIn

官方颁发的SSL证书与自签名证书结合实现网站双向认证

这是一个非常有趣的实验. 大家已经知道,一些SSL证书颁发机构颁发的证书,只是装在服务器端,让访问者通过SSL链接访问网站,并且可以向访问者证实网站的真实地址.但是,如果要限制网站的访问者,也就需要验证客户端所拥有的证书,这样才能建立安全链接.而机构在颁发SSL证书的时候,并没有配套的客户端证书,因此无法在客户端安装,也就无法开启对客户端的认证了. AD CS的证书服务可以颁发服务器端SSL证书,也可以颁发客户端证书(见前文),但是AD CS颁发的服务器端SSL证书只能绑定一个域名,即 WWW.

JAVA中读取xls数据方法介绍

用例编号(UI-0001) 用例名称({验证页面跳转|验证元素文本}-简要明确表述) 验证类型 是否执行 初始URL 初始元素xpath 目标元素xpath 目标元素属性 期望结果 UI-0001 验证页面跳转-登录 当前标签页 执行 http://www.yixun.com/ //a[@id='j_login'] 0 0 https://base.yixun.com/login.html UI-0002 验证页面跳转-购物车 当前标签页 执行 http://www.yixun.com/ //a

Java中的DeskTop类使用介绍

在Jdk1.6以后新增加了一个类--DeskTop,在JDK中它的解释是这样的: The Desktop class allows a Java application to launch associated applications registered on the native desktop to handle a URI or a file. Supported operations include: launching the user-default browser to sho