java ssl 双向通信_使用wireshark观察SSL/TLS握手过程--双向认证/单向认证

本文介绍了Java SSL双向通信的原理,并通过Wireshark观察了SSL/TLS的握手过程,包括双向认证和单向认证的步骤。详细解析了握手过程中各个步骤的作用,如Client Hello、Server Hello、密钥交换等,同时提供了不同签名算法(RSA、DSA)下证书的使用情况。
摘要由CSDN通过智能技术生成

2014年11月11日 17:04:23

fw0124

阅读数 50741更多

个人分类:

数据加密

SSL/TLS握手过程可以分成两种类型:

1)SSL/TLS 双向认证,就是双方都会互相认证,也就是两者之间将会交换证书。

2)SSL/TLS 单向认证,客户端会认证服务器端身份,而服务器端不会去对客户端身份进行验证。

我们知道,握手过程实际上就是通信双方协商交换一个用于对称加密的密钥的过程,而且握手过程是明文的。

这个过程实际上产生三个随机数:client random, server random, pre-master secret. 参考图解SSL/TLS协议 .

前两个随机数都是明文传送的,只有pre-master secret是加密的(RSA或者DH)。

一般生成证书的时候,签名算法可以选择RSA或者DSA算法。

如果server使用RSA证书,RSA即可以用作签名也可以用作不对称加密,pre-master secret就是用server的RSA证书中包含的公钥加密的。

如果server使用DSA证书,DSA只能用作签名,所以还需要使用DH算法来交换密钥。

以下是其流程图(摘自rfc5246),括号中的步骤是可选的。

如果是单向认证,那么蓝色字体部分是不需要的。

4 server_key_exchange这一步只有在选择了某些密钥交换算法例如DH算法的时候才需要。

ClientServer

1 Client Hello

2 Server Hello

3 certificate

4 (server_key_exchange)5 (certificate_request)6 server_hello_done

7 (certificate)

8 client_key_exchange

9 (certifiate_verify)10 change_cypher_spec

----finished----

11 change_cypher_spec

----finished----

下面使用wireshark抓取握手过程的报文。server/client使用JAVA7/JSSE编码。

server证书签名算法RSA-双向认证

6501ea7fb969dbd9726aa78f2b2b7518.png

可见包括了除了4以外的所有步骤。因为采取了RSA算法,所以步骤4是不需要的。

(一) 首先,客户端向服务器提供以下信息96ff41d2f47f1c37c9f645da5056b32a.png

client_hello(1)支持的协议版本,比如TLS 1.0

(2)支持的加密算法(Cipher Specs)

(3)客户端生成的随机数1(Challenge),稍后用于生成"对话密钥"。

(二)服务器回答给客户端以下信息

56630e11d81089e1f97e869fc4f2f427.png

server_hello(1) 确认使用的协议版本

(2) 服务器生成的随机数2,稍后用于生成"对话密钥"

(3) session id

(4) 确认使用的加密算法

certificate服务器证书

server_key_exchange如果是DH算法,这里发送服务器使用的DH参数。RSA算法不需要这一步。

certificate_request要求客户端提供证书,包括

(1) 客户端可以提供的证书类型

(2)服务器接受的证书distinguished name列表,可以是root CA或者subordinate CA。如果服务器配置了trust

keystore, 这里会列出所有在trust keystore中的证书的distinguished name。

server_hello_doneserver hello结束

(三)客户端发送给服务器

950f08b8394b39ba15a7497219c12899.png

certificate客户端证书

client_key_exchange包含pre-master

secret。客户端生成第三个随机数。如果是采用RSA算法,会生成一个48字节随机数,然后用server的公钥加密之后再放入报文中;如果是DH算法,这里发送的就是客户端的DH参数,之后服务器和客户端根据DH算法,各自计算出相同的pre-master

secret。

certificate_verify发送使用客户端证书给到这一步为止收到和发送的所有握手消息签名结果。

change_cipher_spec客户端通知服务器开始使用加密方式发送报文。客户端使用上面的3个随机数client random, server random, pre-master secret, 计算出48字节的master secret, 这个就是对称加密算法的密钥。

finished客户端发送第一个加密报文。使用HMAC算法计算收到和发送的所有握手消息的摘要,然后通过RFC5246中定义的一个伪函数PRF计算出结果,加密后发送。

(四) 服务器发送给客户端

服务器端发送change_cipher_spec和finished消息。到这里握手结束。

server证书签名算法DSA-双向认证

下面是一个server证书采用DSA算法的握手过程。由于采用了DH算法交换密钥,多了server_key_exchange这一步。

1ec9a3f4f03ef1a80f3c478df53c0091.png

server证书签名算法RSA-单向认证

和双向认证相比,server端少了certificate_request,client端少了certificate 和 certificate_verify。

847afb9d3d1e85672ce4b10929048a32.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值