HTTPS加密传输过程
HTTPS加密传输过程
HTTPS
全称Hyper Text Transfer Protocol over SecureSocket Layer
,是以安全为目标的HTTP
通道,在HTTP
的基础上通过传输加密和身份认证保证了传输过程的安全性。HTTPS
在HTTP
的基础下加入SSL
层,HTTPS
的安全基础是SSL
,因此加密的详细内容就需要SSL
。
知识储备
HTTP
HTTP
是应用层协议,默认运行在80
端口,是一种不安全的传输协议,经其传输的数据都是未加密的明文数据,可以被中间人攻击,获取到你的网络传输数据,这也就是尽量不要使用公共场所WIFI
的原因。
HTTPS
HTTPS
是应用层协议,默认运行在443
端口,是一种安全的传输协议,通过在HTTP
层与运输层的TCP
直接加入一个加密/身份验证层来保证安全传输。
SSL
SSL
安全套接层Secure Sockets Layer
,位于TCP/IP
协议与各种应用层协议之间,为数据通讯提供安全支持。SSL
协议可分为两层:
SSL
记录协议SSL Record Protocol
:它建立在可靠的传输协议如TCP
之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。
SSL
握手协议SSL Handshake Protocol
:它建立在SSL
记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
TLS
TLS
传输层安全性协议Transport Layer Security
用于在两个通信应用程序之间提供保密性和数据完整性,其由TLS
记录协议和TLS
握手协议组成。TLS1.0
即为SSL3.0
的标准化版本,SSL
最初由网景Netscape
提出研发,在SSL3.0
时由国际互联网工程任务组IETF
进行了标准化并添加了少量机制,并更名为TLS1.0
。
对称加密
简单来说对称加密的加密密钥和解密密钥是相同的,对称加密的效率要比非对称加密高。
非对称加密
简单来说非对称加密的加密密钥与解密密钥是不同的,需要一把公钥与一把私钥,私钥不能被其他任何人知道,公钥则可以随意公开。公钥加密,私钥解密;私钥数字签名,公钥验证。
CA
由于公钥是放在服务器的,在建立连接的过程中将公钥传输到用户,但是如何避免中间人攻击,即在传输公钥的过程中避免劫持,于是引入第三方认证权威机构CA
,大多数操作系统的CA
证书是默认安装的,CA
也拥有一个公钥和私钥。任何人都可以得到CA
的证书,其包含公钥,用以验证它所签发的证书。CA
为服务申请者颁发证书,在CA
判明申请者的身份后,便为他分配一个公钥,并且CA
将该公钥与申请者的身份信息绑在一起,并为之签字后,便形成证书发给申请者。如果一个用户想鉴别一个证书的真伪,他就用CA
的公钥对那个证书上的签字进行验证,一旦验证通过,该证书就被认为是有效的。证书实际是由证书签证机关CA
签发的对用户的公钥的认证。
传输过程
- 首先
TCP
三次握手建立链接,这是数据传输基础,在此之上开始SSL
- 客户端首先发送
Client Hello
开始SSL
通信,报文中包含客户端支持的SSL
版本、随机值Random1
、加密算法以及密钥长度等。 - 服务器发送
Server Hello
,和客户端一样,在报文中包含SSL
版本、随机值Random2
以及加密组件,此后服务端将证书也发送到客户端。 - 此时客户端需要对服务端发送的证书进行验证,通过操作系统内置的
CA
证书,将服务器发送的证书的数字签名进行解密,并将证书的公钥进行相同算法的HASH
与解密的数字签名解密的内容进行对比,验证证书是否合法有效,是否被劫持更换。 - 客户端验证证书合法,然后生成一个随机值
Random3
,用公钥对Random3
进行加密,生成Pre-Master Key
,客户端以Client Key Exchange
报文将Pre-Master Key
发送到服务端,此后发送Change Cipher Spec
报文表示此后数据传输进行加密传输。 - 服务端将
Pre-Master Key
用自己的私钥解密为Random3
,服务端发送Change Cipher Spec
报文表示此后数据传输进行加密传输。 - 此时客户端与服务端都拥有三个随机字符串,且
Random3
是密文传输的,是安全状态的,此时则可以使用这三个字符串进行对称加密传输。由于非对称加密慢,不能每次传输数据都进行非对称加密,所以使用非对称加密将密钥协商好然后使用对称加密进行数据传输。 - 此时便正常进行
HTTP
数据传输,但是由于SSL
加密的作用,此时的HTTP
传输便是安全的,此为HTTPS
的传输过程,其中2
、3
、5
、6
也被称为SSL
四次握手。
参考
https://www.cnblogs.com/yangtianle/p/11202574.html
https://www.cnblogs.com/liyulong1982/p/6106132.html
https://blog.csdn.net/lyztyycode/article/details/81259284
https://blog.csdn.net/lihuang319/article/details/79970774
https://blog.csdn.net/qq_32998153/article/details/80022489
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十二)Spring集成Redis缓存
- 前端开发中的字符编码
- 算法工程师的面试难不难,如何准备?-图像处理/CV/ML/DL到HR面总结
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(九)Linux下安装redis及redis的常用命令和操作
- 通过使用hint unnest调优sql语句(r4笔记第38天)
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十一)redis密码设置、安全设置
- 极简增强学习新手教程 返回专栏查看评论
- 经典Java面试题收集
- 百度魅族深度学习大赛初赛冠军作品(图像识别.源码)
- easyUI整合富文本编辑器KindEditor详细教程(附源码)
- 经典Java面试题收集(二)
- 使用sqlt手工创建sql_profile(r4笔记第37天)
- 使用ash分析ORA-01652问题(r4笔记第36天)
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(八)线上Mysql数据库崩溃事故的原因和处理
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- linux系统运维企业常见面试题集合(三)
- python第三十二课——队列
- python第三十四课——1.匿名函数的定义和使用
- python第三十四课——2.匿名函数配合容器函数的使用
- 专家专栏|使用agent2自定义插件采集通过MQTT协议发送的数据
- Linux系统双网卡绑定配置教程
- python第三十五课——生成器
- python第三十六课——1.可迭代对象
- Linux系统Shell编程——脚本编写思路与过程
- python第三十六课——2.迭代器对象
- python第三十七课——模块
- Linux系统MySQL数据库主从同步实战过程
- 最火的java8新特性:Lambda 表达式
- python第三十九课——面向对象(二)之设计类
- python第三十九课——面向对象(二)之初始化属性