HTTPS加密流程理解
HTTPS加密流程
由于HTTP的内容在网络上实际是明文传输,并且也没有身份验证之类的安全措施,所以容易遭到挟持与攻击
HTTPS是通过SSL(安全套接层)和TLS(安全传输协议)的组合使用,加密TCP载荷即HTTP报文内容,同时通过不对称密钥方式认证身份,保证传输的安全可靠
即:HTTP+加密+认证+完整性保护=HTTPS
对称加密与非对称加密
对称加密:编/解码使用相同密钥的算法,一般是共享密钥

非对称加密:非对称加密算法需要两个密钥,公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。 公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。 因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法

在HTTPS中,这两种加密方式混合使用

数字证书认证
由于公钥在下发的时候也容易被替换劫持,所以需要个第三方认证机构确认公钥的正确性
CA:数字证书认证机构,是客户端服务端都认可的第三方机构,负责数字签名服务端公钥
数字签名:签名就是一种证明身份的机制,是一种校验机制(简单说是用私钥加密内容的hash,公钥解密对比hash判断内容是否完整)
数字证书:由一个可信的组织验证和签发的识别信息
HTTPS中数字认证流程如下

HTTPS握手过程
HTTPS在进行传输HTTP报文数据前,需要经过TLS握手,完成加密,大致流程如下:

- Client Hello:握手第一步是客户端向服务端发送 Client Hello 消息,这个消息里包含了一个客户端生成的随机数 Random1、客户端支持的加密套件(Support Ciphers)和 SSL Version 等信息
- Server Hello:第二步是服务端向客户端发送 Server Hello 消息,这个消息会从 Client Hello 传过来的 Support Ciphers 里确定一份加密套件,这个套件决定了后续加密和生成摘要时具体使用哪些算法,另外还会生成一份随机数 Random2。注意,至此客户端和服务端都拥有了两个随机数(Random1+ Random2),这两个随机数会在后续生成对称秘钥时用到。
- Certificate:这一步是服务端将自己的证书下发给客户端,让客户端验证自己的身份,客户端验证通过后取出证书中的公钥
- Server Hello Done:通知客户端 Server Hello 过程结束。
- Certificate Verify:客户端收到服务端传来的证书后,先从 CA 验证该证书的合法性,验证通过后取出证书中的服务端公钥,再生成一个随机数 Random3,再用服务端公钥非对称加密 Random3生成 PreMaster Key
- Client Key Exchange:上面客户端根据服务器传来的公钥生成了 PreMaster Key,Client Key Exchange 就是将这个 key 传给服务端,服务端再用自己的私钥解出这个 PreMaster Key 得到客户端生成的 Random3。至此,客户端和服务端都拥有 Random1 + Random2 + Random3,两边再根据同样的算法就可以生成一份秘钥,握手结束后的应用层数据都是使用这个秘钥进行对称加密。为什么要使用三个随机数呢?这是因为 SSL/TLS 握手过程的数据都是明文传输的,并且多个随机数种子来生成秘钥不容易被暴力破解出来。
- Change Cipher Spec(Client):这一步是客户端通知服务端后面再发送的消息都会使用前面协商出来的秘钥加密了,是一条事件消息
- Encrypted Handshake Message(Client):这一步对应的是 Client Finish 消息,客户端将前面的握手消息生成摘要再用协商好的秘钥加密,这是客户端发出的第一条加密消息。服务端接收后会用秘钥解密,能解出来说明前面协商出来的秘钥是一致的
- Change Cipher Spec(Server):这一步是服务端通知客户端后面再发送的消息都会使用加密,也是一条事件消息
- Encrypted Handshake Message(Server):这一步对应的是 Server Finish 消息,服务端也会将握手过程的消息生成摘要再用秘钥加密,这是服务端发出的第一条加密消息。客户端接收后会用秘钥解密,能解出来说明协商的秘钥是一致的。
- Application Data:到这里,双方已安全地协商出了同一份秘钥,所有的应用层数据都会用这个秘钥加密后再通过 TCP 进行可靠传输
其它
还有一种双向认证的模式,即在Server Hello Done前发送Certificate Request ,它是服务端要求客户端上报证书,这一步是可选的,对于安全性要求高的场景会用到,这里不做详解
如果每次重连都要重新握手还是比较耗时的,所以可以对握手过程进行优化,可以在 Client Hello 消息里还附带了上一次的 Session ID,服务端接收到这个 Session ID 后如果能复用就不再进行后续的握手过程。
参考
1.《图解HTTP》
2.《HTTP权威指南》
HTTPS加密流程理解的更多相关文章
- HTTPS加密流程超详解(一)前期准备
0.前言 前一阵子想写一个HTTPS的嗅探工具,之前只是大致了解SSL/TLS协议的加密流程,真正上起手来一步一步分析发现还是有点复杂的,于是我参考了wireshark的源码以及各种RFC,弄清楚了S ...
- HTTPS加密流程超详解(二)
2.进入正题 上篇文章介绍了如何简单搭建一个环境帮助我们分析,今天我们就进入正题,开始在这个环境下分析. 我们使用IE浏览器访问Web服务器根目录的test.txt文件并抓包,可以抓到如下6个包(前面 ...
- https加密流程
引用其它博主博客,在这里谢谢这位博主,原博客地址:https://blog.csdn.net/xincai/article/details/51954468 1,下面,用一幅图展示一下https建立 ...
- java-信息安全(九)-基于DH,非对称加密,对称加密等理解HTTPS
概述 java-信息安全(七)-基于非对称加密,对称加密等理解HTTPS 如果想要理解好https,请尽量了解好以上信息等. 参看文章: http://www.ruanyifeng.com/blog/ ...
- HTTPS的加密流程(通俗易懂,不可错过)
为什么要有HTTPS 都说进技术的产生就是为了解决旧技术的一些弊端. HTTP具有相当优秀的一面,但是凡事有利也有弊,在HTTP进行高速通信的过程中可能产生以下几个问题: HTTP采用明文传输.明文传 ...
- 转: https 加密通信流程
https 加密通信流程当用户在浏览器中输入一个以https开头的网址时,便开启了浏览器与被访问站点之间的加密通信.下面我们以一个用户访问https://qbox.me为例,给读者展现一下SSL/TL ...
- HTTPS加密证书流程(2)
目录 一:HTTPS加密证书流程 二:证书对比 三:自签证书 1.(lb服务器负载均衡代理) 2.(创建CA证书 创建密码) 3.生成自签证书(公钥),同时去掉私钥的密码(Enter) 四:证书内容解 ...
- HTTPS 基本流程 转载 https://zhuanlan.zhihu.com/p/27395037
协议 1.HTTP 协议(HyperText Transfer Protocol,超文本传输协议):是客户端浏览器或其他程序与Web服务器之间的应用层通信协议 . 2.HTTPS 协议(HyperTe ...
- [信息安全] 3.HTTPS工作流程
[信息安全]系列博客:http://www.cnblogs.com/linianhui/category/985957.html 0. 简单回顾 在前面两篇博客中介绍了密码相关的一些基本工具,包括(对 ...
随机推荐
- Jquery的load加载本地文件出现跨域错误的解决方案
如果用原生的AJAX是加载本地文件就不会出现错误.当然,这个jquery的load放在服务器上通过http加载还是支持的.也有例外比如在firefox和ie浏览器使用$.ajax加载本地html或tx ...
- Cocos Creator实现大炮英雄,附代码!
游戏预览 开始场景 搭建开始场景 摆放一个背景图,在背景图上添加背景地面.开始按钮.4个角色选择按钮.游戏logo. 创建游戏脚本 1. 实现开始按钮的回调,点击开始按钮,跳转到游戏场景.跳转 ...
- 美化你的IDEA—背景图片
IDEA设置背景图片 很多人都不知道IDEA可以像桌面一样设置背景图片,下面我们来美化我们的开发工具. 有的IDEA版本是搜不到的,我这个就是,现在搜的是已经装好的. 没有的我们可以去http://p ...
- Making the Grade POJ - 3666
A straight dirt road connects two fields on FJ's farm, but it changes elevation more than FJ would l ...
- 理解numpy.dot()
import numpy.matlib import numpy as np a = np.array([[1,2],[3,4]]) b = np.array([[11,12],[13,14]]) p ...
- python-犯傻合集
1.题目: 基于文件实现用户登录程序,提示用户输入用户名和密码,检查用户名是否存在,以及用户名密码是否正确 保存密码的文件叫user.txt,内容: | 作分隔符 阶段一: 自己第一次的答案: ...
- [JZOJ5185] 【NOIP2017提高组模拟6.30】tty's sequence
Description
- libevent::日志
LibEvent 能记录内部的错误和警告日志,如果编译进日志支持功能,也会记录调试信息.默认情况下这些消息都是输出 到 stderr,你也可以通过提供自己的日志函数的方法来覆盖这种行为. 为了覆盖 L ...
- Spring使用AspectJ开发AOP:基于XML
基于XML的声明式 基于 XML 的声明式是指通过 Spring 配置文件的方式定义切面.切入点及声明通知,而所有的切面和通知都必须定义在 <aop:config> 元素中. 下面通过案例 ...
- HTTP协议详解(二)—— HTTP响应
HTTP响应(Response) 响应与请求一样分成三个部分:响应行.响应头.响应体. 1.响应行: 格式 - HTTP/1.1 200 OK 2.响应头: 部分头属性解释 - Location:这个 ...