前言

先说看了一天各种博客让我恶心的地方,恶心死了,发现每个人说的第一次发送的内容,数字证书里面包含啥,都有各种不一样!到了最后忽然想起来直接搜着报文就行了。

比如这个博客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双方获取共用的秘钥过程!!!!!的更多相关文章

  1. https 加密、http2.0、keep-alive

    原文地址:https://ainyi.com/44 HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议 ...

  2. HTTPS加密越来越流行,为何要加密?

    继谷歌之后,国内最大的搜索引擎百度在2015年5月实现了全站HTTPS加密.搜狗搜索.360搜索.bing搜索.淘宝.天猫.知乎等也都实现了全站HTTPS加密,互联网即将迎来全网HTTPS加密时代. ...

  3. 百度HTTPS加密搜索有什么用?

    前段时间,我曾提到百度支持移动端HTTPS SSL加密搜索,用以保护用户隐私.最近,百度开始支持PC端HTTPS SSL加密搜索,现在可以启用 https://www.baidu.com 搜索.我很少 ...

  4. https加密过程

    https加密完整过程 step1: “客户”向服务端发送一个通信请求 “客户”->“服务器”:你好 step2: “服务器”向客户发送自己的数字证书.证书中有一个公钥用来加密信息,私钥由“服务 ...

  5. HTTPS加密原理与过程

    HTTPS加密原理与过程 HTTP 超文本传输协议一种属于应用层的协议 缺点: 通信使用明文(不加密),内容可能会被窃听 不验证通信方的身份,因此有可能遭遇伪装 无法证明报文的完整性,所以有可能已遭篡 ...

  6. HTTPS加密传输过程

    HTTPS加密传输过程 HTTPS全称Hyper Text Transfer Protocol over SecureSocket Layer,是以安全为目标的HTTP通道,在HTTP的基础上通过传输 ...

  7. HTTPS加密通信原理及数字证书系统

    https加密通信原理: 公钥私钥成对,公钥公之于众,私钥只有自己知道. 用公钥加密的信息只能由与之相对应的私钥解密. 甲给乙发送数据时,甲先用乙的公钥加密这段数据,再用自己的私钥对这段数据的特征数据 ...

  8. 为什么站点使用https加密之后还能看到相关数据

    为什么站点使用了https加密之后,还是能够用firebug之类的软件查看到提交到的信息,并且还是明文的?例如说这样: 这是因为:https(ssl)加密是发生在应用层与传输层之间,所以在传输层看到的 ...

  9. 我用阿里云的虚拟云主机,也能配置https加密吗?

    我用阿里云的虚拟云主机,也能配置https加密吗?答案是YES. 整个过程比想象中还要简单,都是一些基本的配置,虚拟主机 Web托管都可以很容易的搞定https. 首先我们要了解一下,阿里云是怎么支持 ...

  10. 白话HTTPS加密机制

    在讲主题之前,我们先来区分两个概念:签名和加密有什么区别? 我们从字面意思看: 签名就是一个人对文件签署自己的名字,证明这个文件是我写的或者我认可的,所以只要别人看到我的签名,认识我字迹的人就知道这个 ...

随机推荐

  1. Java-【大数处理】和【日期类】

    [大数类] BigInteger(整数) 和 BigDecimal(小数) 都是Java针对大数提供的类 常用方法: (1)加:add (2)减:subtract (3)乘:multiply (4)除 ...

  2. react对于setState的写法

    react对于setState的写法,改变state的数组里边的值也可以这样写 [1,2,3,4,5].forEach((item)=>{ let arr={} arr[`list${item} ...

  3. 【相关杂项】stdio.h中的sprintf函数/union的作用

    1.定义int sprintf(char *str, const char *format, ...)         1.paras:*str:目标字符串首指针  *format:要写入目标字符串的 ...

  4. Docker学习——Kubernetes(八)

    在线阅读:GitBook 下载:pdf Kubernetes 是 Google 团队发起并维护的基于 Docker 的开源容器集群管理系统,它不仅支持常见的云平台,而且支持内部数据中心. 建于 Doc ...

  5. mongodb删除指定字段

    db.getCollection('geoServer').update({},{$unset:{longitude:null,latitude:null}},{ multi: true}) 实测有效 ...

  6. CSS之 font

    font:font-style font-weight font-size/line-height font-family的简写.顺序不能乱 **eg ** font:italic bold 30px ...

  7. 【JavaScript】JS写法随笔(三) JS联动设置元素默认值

    问题: 使用DOM获取元素后setAttribute("value", "1")在页面有修改此标签value的情况下,再次触发function发生不生效.无法修 ...

  8. Mac截网页长屏的方法-谷歌浏览器

    打开chrome,左上角帮助,输入[开发者工具],回车,右边显示出一些html代码, 然后shift+command+p: 输入full,选择第一个capture full size screensh ...

  9. 小梅哥课程学习——LED花式玩法(从计数器器到线性序列机)——实验六

    //每隔10ms,让led灯的一个8状态循环执行一次(每个变化时间值小一点,方便测试比如设置为10us) 源代码 module counter_led_6(    clk,    reset_n,   ...

  10. XML_DOM4J_20200415

    package com.wy.xml; import java.io.File;import java.util.Iterator; import org.dom4j.Attribute; impor ...