https加密过程!!! 这才是差不多非常详细的https双方获取共用的秘钥过程!!!!!
前言
先说看了一天各种博客让我恶心的地方,恶心死了,发现每个人说的第一次发送的内容,数字证书里面包含啥,都有各种不一样!到了最后忽然想起来直接搜着报文就行了。
比如这个博客LS/SSL 协议详解 (9) Client hello:https://blog.csdn.net/mrpre/article/details/77867439 这个人的博客有各个报文的每个字段的详细解释!让我纳闷了一天那些博客怎么那么多矛盾,发现都错了好多!
建议搭配这个看 HTTPS工作流程.png
整理了一下我的:
https就是厉害在传输数据是安全的,传输过程中不会被其他方获取你的内容。用什么实现?SSL/TSL,也就是https就是用SSL/TSL实现http的加密传输。SSL“安全套接层”协议,TLS“安全传输层”协议,都属于是加密协议,在其网络数据传输中起到保护隐私和数据的完整性。像对称加密,非对称加密这种基本概念不说了,https主要就是双方偷偷规定一个世界上独一无二的秘钥,之后就用这套秘钥交流,就在于如和偷偷规定这个秘钥。
C:客户端 S:服务端
先来个三次握手 SYN(SYN-SENT) -> ACK+SYN+seq(SYN-RCVD) -> ACK+ack_num=seq+1(ESTABLISHED) 这个过程是客户端发请求,TCP分配到433端口。
1 client hello:
C->S 给个随机数rand1,支持的TLS版本号以及加密算法等。S->C会先回个ACK表示收到了,在这就不算个步骤了。
2 server hello & server certificent & server hello done:
回个使用哪个版本号的TLS和加密算法。还有个随机值rand2。然后发自己的数字证书,还包括签名用的hash算法。将明文hash成摘要,然后用CA的私钥加密摘要生成数字签名。 最后发个server hello done报文。 这个2我把这3个报文写一起了,从上边我说的那个png图可以更清楚的看到顺序。
3 验证证书:
C给S回个ACK表示收到了。开始验证证书,先验证明文部分,看看是否过期,网址是否正确。再用在操作系统或者浏览器上内置的CA公钥把数字签名给变回去,然后判断和证书中的明文的hash值是否相等,不相等说明被篡改了,停止交易。验证阶段还有一些其他东西,比如如果找不到这个CA证书,服务器会返回一个跟证书,让你选择是否信任。
4 client key exchange:
C->S 生成一个rand3,然后用公钥加密rand3生成一个Pre-Master Key,然后客户端发送一个Client Key Exchange报文把pre-master key发过去。服务端用私钥解密获得rand3。这个时候双方都有rand123,然后根据双方选择的加密算法算出来一个公用秘钥session-key。
5 客户端的change cipher spec & finish:
C->S 发一个change cipher spec报文表示之后会话使用秘钥来对称加密,然后发个finish报文,包含用秘钥加密的所有握手数据的摘要。
6 服务端的change cipher spec & finish:
S->C 先回一个ack,再验证一下用秘钥解密的finish报文是否和自己算出来的摘要一样。然后和客户端一样。发个两个报文。
7 搞完了:
客户端也回一个ack,表示知道了,之后就可以使用秘钥进行对称加密了。
关于4中选择哪个加密算法,在最开始的client hello报文里面的Cipher Suite里面有支持的加密算法,然后在server hello中返回的有选择使用哪一种。
这个图就是我开头提到的
思考:
其实归根结底就是如何使3个随机数只有双方知道。就是用服务器给客户的公钥,客户用这个公钥加密一个随机数,这样就只有服务端能解密。进一步就是保证服务器的公钥能够不被篡改,不被替换地到达客户端,所以用到了数字证书,保证不被篡改。
但是到这还有个问题,那么有了公钥直接以后用公私钥的非对称加密不就行了吗,还弄什么秘钥对称加密?当然不行,如果有中间人,只查看,不更改数字证书,中间人也能获得服务器的公钥,尽管不能破解客户端的信息,但有这个公钥就能知道服务端发送的信息,所以还是需要双方定一个秘钥。
参考:
(五)HTTPS抓包了解TLS握手流程:https://zhuanlan.zhihu.com/p/86304211
完全理解HTTPS如何做到传输安全: https://juejin.cn/post/6844903613479796750
HTTPS加密传输过程 :https://www.cnblogs.com/WindrunnerMax/p/12580585.html //这个博客后变推荐的几个博客很赞!!!
https加密过程!!! 这才是差不多非常详细的https双方获取共用的秘钥过程!!!!!的更多相关文章
- https 加密、http2.0、keep-alive
原文地址:https://ainyi.com/44 HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议 ...
- HTTPS加密越来越流行,为何要加密?
继谷歌之后,国内最大的搜索引擎百度在2015年5月实现了全站HTTPS加密.搜狗搜索.360搜索.bing搜索.淘宝.天猫.知乎等也都实现了全站HTTPS加密,互联网即将迎来全网HTTPS加密时代. ...
- 百度HTTPS加密搜索有什么用?
前段时间,我曾提到百度支持移动端HTTPS SSL加密搜索,用以保护用户隐私.最近,百度开始支持PC端HTTPS SSL加密搜索,现在可以启用 https://www.baidu.com 搜索.我很少 ...
- https加密过程
https加密完整过程 step1: “客户”向服务端发送一个通信请求 “客户”->“服务器”:你好 step2: “服务器”向客户发送自己的数字证书.证书中有一个公钥用来加密信息,私钥由“服务 ...
- HTTPS加密原理与过程
HTTPS加密原理与过程 HTTP 超文本传输协议一种属于应用层的协议 缺点: 通信使用明文(不加密),内容可能会被窃听 不验证通信方的身份,因此有可能遭遇伪装 无法证明报文的完整性,所以有可能已遭篡 ...
- HTTPS加密传输过程
HTTPS加密传输过程 HTTPS全称Hyper Text Transfer Protocol over SecureSocket Layer,是以安全为目标的HTTP通道,在HTTP的基础上通过传输 ...
- HTTPS加密通信原理及数字证书系统
https加密通信原理: 公钥私钥成对,公钥公之于众,私钥只有自己知道. 用公钥加密的信息只能由与之相对应的私钥解密. 甲给乙发送数据时,甲先用乙的公钥加密这段数据,再用自己的私钥对这段数据的特征数据 ...
- 为什么站点使用https加密之后还能看到相关数据
为什么站点使用了https加密之后,还是能够用firebug之类的软件查看到提交到的信息,并且还是明文的?例如说这样: 这是因为:https(ssl)加密是发生在应用层与传输层之间,所以在传输层看到的 ...
- 我用阿里云的虚拟云主机,也能配置https加密吗?
我用阿里云的虚拟云主机,也能配置https加密吗?答案是YES. 整个过程比想象中还要简单,都是一些基本的配置,虚拟主机 Web托管都可以很容易的搞定https. 首先我们要了解一下,阿里云是怎么支持 ...
- 白话HTTPS加密机制
在讲主题之前,我们先来区分两个概念:签名和加密有什么区别? 我们从字面意思看: 签名就是一个人对文件签署自己的名字,证明这个文件是我写的或者我认可的,所以只要别人看到我的签名,认识我字迹的人就知道这个 ...
随机推荐
- Java基础学习:2、Java数据类型及逻辑运算符
1.数据类型: 数据类型范围: byte:-2^7 ~ 2^7-1,即-128 ~ 127.1字节.Byte.末尾加B short:-2^15 ~ 2^15-1,即-32768 ~ 32767.2字节 ...
- 全局 使用 stylus 变量
首先 安装 啦 npm i stylus stylus-loader -D 之后 使用全局变量 然后在组件中引用改变量 -->没有用! 原因还没有在build/utils.js文件 全局引入 ...
- bzoj 4573
LCT神题... 首先暴力的做法就是每次在一个区间上link,然后暴力查询,时间复杂度$O(爆炸)$ 但是我们可以发现的是,每棵树之间互不影响! 因此我们可以考虑离线之后分别统计每棵树 但是这样做其实 ...
- 记一次 windows 10 系统 idea 【ctrl + shift + f】快捷键失效的问题
快捷键失效,首先想到的就是和其它软件设置的快捷键冲突了,把其它软件都关了之后,发现还是不行.最后发现原来是搜狗输入法中设置了,关掉之后就可以了.
- GAN的两种训练方式,以及梯度求导问题——detch(),retain_graph
http://t.zoukankan.com/LXP-Never-p-13951578.html detach():截断node反向传播的梯度流,将某个node变成不需要梯度的Varibale,因此当 ...
- 学习Vue踩过的坑
1.用Vue绑定方法的时候里面的methods:要加s!!! 2.v-on只有在事件监听(@click=" 方法名")和不需要参数时候才不要加 ( ),在胡子写法中{{ fun() ...
- django前后端分离接口开发
用django进行接口开发 接口: /api/parameter (同一个接口地址实现不同的请求方式) 全局参数(get,post,put,delete) GET:获取全局参数的所有数据 POST:创 ...
- 【pytest】pytest.mark.dependency用例依赖标签,并解决依赖失效的问题
pytest第三方插件,用来解决用例之间的依赖关系.如果依赖的用例执行失败后 后续的用例会被跳过执行,相当于智能执行了pytest.mark.skip, 首先要安装插件:pip install pyt ...
- nuxt中处理跨域
一.安装 npm install @nuxtjs/axios @nuxtjs/proxy -S 二.nuxt.config.js进行配置 modules:[ '@nuxtjs/axios' ' ...
- java调用c++的几种方式
jni 类似c#调用c++的方式,定义java端的c++代码接口. package crayon.jni; public class JNITest { public native static vo ...