使用wireshark观察SSL/TLS握手过程--双向认证/单向认证
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算法的时候才需要。
|
Client |
Server |
| 1 Client Hello | |
|
2 Server Hello |
|
| 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-双向认证
可见包括了除了4以外的所有步骤。因为采取了RSA算法,所以步骤4是不需要的。
(一) 首先,客户端向服务器提供以下信息
client_hello
(1)支持的协议版本,比如TLS 1.0
(2)支持的加密算法(Cipher Specs)
(3)客户端生成的随机数1(Challenge),稍后用于生成"对话密钥"。
(二)服务器回答给客户端以下信息
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_done
server hello结束
(三)客户端发送给服务器
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这一步。
server证书签名算法RSA-单向认证
和双向认证相比,server端少了certificate_request,client端少了certificate 和 certificate_verify。
使用wireshark观察SSL/TLS握手过程--双向认证/单向认证的更多相关文章
- SSL/TLS 握手过程详解
在现代社会,互联网已经渗透到人们日常生活的方方面面,娱乐.经济.社会关系等都离不开互联网的帮助.在这个背景下,互联网安全就显得十分重要,没有提供足够的安全保障,人们是不会如此依赖它的.幸运的是,在大牛 ...
- SSL/TLS握手过程
----------------------------------专栏导航----------------------------------HTTPS协议详解(一):HTTPS基础知识 HTTPS ...
- SSL/TSL握手过程详解
1. Client Hello 握手第一步是客户端向服务端发送 Client Hello 消息,这个消息里包含了一个客户端生成的随机数 Random1.客户端支持的加密套件(Support Ciphe ...
- 抓包分析SSL/TLS连接建立过程【总结】
1.前言 最近在倒腾SSL方面的项目,之前只是虽然对SSL了解过,但是不够深入,正好有机会,认真学习一下.开始了解SSL的是从https开始的,自从百度支持https以后,如今全站https的趋势越来 ...
- SSL/TLS 握手优化详解
随着 HTTP/2 的逐渐普及,以及国内网络环境越来越糟糕(运营商劫持和篡改),HTTPS 已经开始成为主流.HTTPS 在 TCP 和 HTTP 之间增加了 TLS(Transport Layer ...
- HTTPS中SSL/TLS握手时的私钥用途(RSA、ECDHE)
从上一篇HTTPS中CA证书的签发及使用过程中知道服务端在申请CA证书时只上交了密钥对中的公钥,那么只有服务端知道的私钥有什么作用呢? SSL/TLS层的位置 SSL/TLS层在网络模型的位置,它属于 ...
- SSL&TlS握手
SSL/TLS简介 •SSL:安全套接字层(secure socket layer) •TLS:传输层安全协议(transport layer security) SSL和TLS都是加密协议,旨在基于 ...
- HTTP和HTTPS的区别,SSL的握手过程
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂 ...
- 使用wireshark捕获SSL/TLS包并分析
原创博客,转载请注出处! TLS运作方式如下图:
随机推荐
- 学习mybatis时出现了java.io.IOException: Could not find resource EmployeeMapper.xml
使用mybatis时出现了Could not find resource EmployeeMapper.xml和Could not find resource mybatis-config.xml两种 ...
- npm install 时总是报phantomjs-prebuilt@2.1.14安装失败
在npm install时总是报如下错误, 尝试单独安装:npm install phantomjs-prebuilt@2.1.14 还是报错 Please report this full log ...
- 20165332实验二 Java面向对象程序设计
20165332实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验要求 ...
- Selenium with Python 009 - WebDriver API
官方API文档:https://seleniumhq.github.io/selenium/docs/api/py/api.html 更多详情,最好的学习方式可以查阅官方API文档或直接阅读源码,本文 ...
- 五十一 Python分布式爬虫打造搜索引擎Scrapy精讲—scrapyd部署scrapy项目
scrapyd模块是专门用于部署scrapy项目的,可以部署和管理scrapy项目 下载地址:https://github.com/scrapy/scrapyd 建议安装 pip3 install s ...
- 【Python】内置函数清单
Python内置(built-in)函数随着python解释器的运行而创建.在Python的程序中,你可以随时调用这些函数,不需要定义.最常见的内置函数是: print("Hello Wor ...
- 来自lombok的注解(解决idea中的找不到get,set方法,找不到log的问题)
今天看代码,发现idea报错,仔细一看调用的get,set方法bean中都没有,但是运行起来却没有问题,这个让我很疑惑.后来发现在类上有一个以前没见过的注解@Data,大概就是因为有他的原因.这个注解 ...
- 【第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛-F】等式(因子个数)
题目描述 给定n,求1/x + 1/y = 1/n (x<=y)的解数.(x.y.n均为正整数) 输入描述: 在第一行输入一个正整数T.接下来有T行,每行输入一个正整数n,请求出符合该方程要求的 ...
- 配置 Web 组件服务器 IIS 证书
用 IIS 6 配置 Web 组件证书(对于 Windows Server 2003) 使用 IIS 管理器向 Web 组件服务器分配证书.对合并池配置中的 Standard Edition ...
- 关于 SimpleDateFormat 的非线程安全问题及其解决方案
一直以来都是直接用SimpleDateFormat开发的,没想着考虑线程安全的问题,特记录下来(摘抄的): 1.问题: 先来看一段可能引起错误的代码: package test.date; impor ...