[TOC]
# HTTPS综述
HTTPS是在HTTP上建立SSL加密层,对传输数据进行加密,是HTTP协议的安全版。主要作用是:
1、对数据进行加密,建立一个信息安全通道来保证传输过程中数据的安全
2、对网站服务器进行真实身份认证
# HTTP通信存在的问题
1、HTTP通信使用明文,内容可能被窃听
2、无法证明报文的完整性,可能遭篡改
3、不验证通信方的身份,可能遭遇伪装
# HTTPS如何改进了HTTP存在的问题
![](https://img.kancloud.cn/44/8d/448d749ef0bba8fd5128ea50f2e8477a_543x248.png)
HTTP直接和TCP通信,当使用SSL时,变成HTTP先和SSL通信,再由SSL和TTCP通信。也就是HTTPS就是身披SSL协议这层外壳的HTTP。
![](https://img.kancloud.cn/64/ad/64adee31f03500b31eb08838fa9325f1_539x300.png)
## 加密
HTTPS协议的主要功能依赖于TLS/SSL协议,TLS/SSL的功能实现主要依赖于三类基本算法:散列函数、对称加密和非对称加密,其中利用非对称加密实现身份认证和密钥协商,对称加密算法采用协商后的密钥对数据加密,基于散列函数验证信息的完整性。
![](https://img.kancloud.cn/f5/43/f543a9283b886b0fbf01402acaaf63bd_561x297.png)
1、对称加密
这种方式加密和解密使用同一个密钥。
2、非对称加密
公开密钥和私有密钥是配对的一套密钥,发送密文的一方使用对方的公开密钥进行加密处理,对方收到加密信息后,使用自己的私有密钥进行解密。
这种方式不需要发送用来解密的私有密钥,就不用担心密钥被窃听而盗走。但使用非对称加密在数据加密解密过程需要消耗一定时间,降低了数据传输效率。
3、对称加密+非对称加密(HTTPS采用的方式)
发送密文的一方使用对方的公开密钥进行加密处理“对称的密钥”,然后对方用自己的私有密钥拿到“对称的密钥”,在确保安全的前提下拿到“对称的密钥”,再使用对称加密的方式进行通信交换报文等。
## 校验数据完整性--数字签名
数字签名的两个功能
1、确定消息是由发送方签名并发送过来的,不是其他人假冒的
2、验证消息的完整性,保证消息未被篡改
数字签名的生成:
![](https://img.kancloud.cn/c8/de/c8de05937e5a525d80c8e67c4d62fa97_704x309.png)
将一段文本先用Hash函数生成消息摘要,然后用发送者的私钥加密生成数字签名,与原文一起传给接受者。
接收者校验数字签名:
![](https://img.kancloud.cn/0a/6c/0a6cca447663eee5d627cdfd1513fc00_581x420.png)
接收者使用Hash函数对收到的文本生成摘要信息,再使用发送者的公钥解密数字签名得到信息摘要,对比两个信息摘要是否完全一致。
当然接收者需要使用发送者的公钥,公钥不能在不安全网络中直接发送,采用的是数字证书方案,后面详细讲解。
## 解放身份伪装问题--数字证书
数字证书认证机构处于客户端与服务器双方都可信赖的第三方机构的立场上。
![](https://img.kancloud.cn/0a/c2/0ac2d28ee204fab5f18b8153b580df88_417x313.png)
数字证书认证机构的业务流程:
* 服务器的运营人员向第三方机构CA提交公钥、组织信息、个人信息(域名)等信息并申请认证;
* CA通过线上、线下等多种手段验证申请者提供信息的真实性,如组织是否存在、企业是否合法,是否拥有域名的所有权等;
* 如信息审核通过,CA会向申请者签发认证文件-证书。证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构 CA的信息、有效时间、证书序列号等信息的明文,同时包含一个签名。其中签名的产生算法:首先,使用散列函数计算公开的明文信息的信息摘要,然后,采用 CA的私钥对信息摘要进行加密,密文即签名;
* 客户端 Client 向服务器 Server 发出请求时,Server 返回证书文件;
* 客户端 Client 读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应 CA的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性,即服务器的公开密钥是值得信赖的。
* 客户端还会验证证书相关的域名信息、有效时间等信息; 客户端会内置信任CA的证书信息(包含公钥),如果CA不被信任,则找不到对应 CA的证书,证书也会被判定非法。
# HTTPS工作流程
![](https://img.kancloud.cn/4c/6d/4c6d886a96c1619beaa71002c7b06f4e_1080x636.png)
1.Client发起一个HTTPS(比如 `https://juejin.im/user`)的请求,根据RFC2818的规定,Client知道需要连接Server的443(默认)端口。
2.Server把事先配置好的公钥证书(public key certificate)返回给客户端。
3.Client验证公钥证书:比如是否在有效期内,证书的用途是不是匹配Client请求的站点,是不是在CRL吊销列表里面,它的上一级证书是否有效,这是一个递归的过程,直到验证到根证书(操作系统内置的Root证书或者Client内置的Root证书)。如果验证通过则继续,不通过则显示警告信息。
4.Client使用伪随机数生成器生成加密所使用的对称密钥,然后用证书的公钥加密这个对称密钥,发给Server。
5.Server使用自己的私钥(private key)解密这个消息,得到对称密钥。至此,Client和Server双方都持有了相同的对称密钥。
6.Server使用对称密钥加密“明文内容A”,发送给Client。
7.Client使用对称密钥解密响应的密文,得到“明文内容A”。
8.Client再次发起HTTPS的请求,使用对称密钥加密请求的“明文内容B”,然后Server使用对称密钥解密密文,得到“明文内容B”。
# HTTPS工作流程简单版:
![](https://img.kancloud.cn/d8/30/d8300f80deaf297b306946637ff28966_913x700.png)
0、CA机构使用其私钥对Server证书(包含Server公钥)信息概要进行加密生成数字签名,将公钥证书部署到Server
1、Client发起Https请求,Server将加密数据返回给Client
2、Client使用CA机构的公钥对加密数据进行解密,得到Server的证书和公钥
3、Client随机生成一个对称加密的密钥,使用Server的公钥对其进行非对称加密
4、Server收到加密后的信息后使用私钥解密,得到对称加密的密钥
5、接下来Client和Server直接就可以使用对称加密的方式进行通信了
# 为何不所有的网站都使用HTTPS
1、首先,很多人还是会觉得HTTPS实施有门槛,这个门槛在于需要权威CA颁发的SSL证书。从证书的选择、购买到部署,传统的模式下都会比较耗时耗力。
2、其次,HTTPS普遍认为性能消耗要大于HTTP,因为与纯文本通信相比,加密通信会消耗更多的CPU及内存资源。如果每次通信都加密,会消耗相当多的资源,平摊到一台计算机上时,能够处理的请求数量必定也会随之减少。
3、购买证书需要额外的开销
4、国内安全意识相对薄弱
参考:[深入理解https工作原理]([https://mp.weixin.qq.com/s/G-mw8oJHWgcSOAV8Vp6bPw](https://mp.weixin.qq.com/s/G-mw8oJHWgcSOAV8Vp6bPw))
- 导读
- Java知识
- Java基本程序设计结构
- 【基础知识】Java基础
- 【源码分析】Okio
- 【源码分析】深入理解i++和++i
- 【专题分析】JVM与GC
- 【面试清单】Java基本程序设计结构
- 对象与类
- 【基础知识】对象与类
- 【专题分析】Java类加载过程
- 【面试清单】对象与类
- 泛型
- 【基础知识】泛型
- 【面试清单】泛型
- 集合
- 【基础知识】集合
- 【源码分析】SparseArray
- 【面试清单】集合
- 多线程
- 【基础知识】多线程
- 【源码分析】ThreadPoolExecutor源码分析
- 【专题分析】volatile关键字
- 【面试清单】多线程
- Java新特性
- 【专题分析】Lambda表达式
- 【专题分析】注解
- 【面试清单】Java新特性
- Effective Java笔记
- Android知识
- Activity
- 【基础知识】Activity
- 【专题分析】运行时权限
- 【专题分析】使用Intent打开三方应用
- 【源码分析】Activity的工作过程
- 【面试清单】Activity
- 架构组件
- 【专题分析】MVC、MVP与MVVM
- 【专题分析】数据绑定
- 【面试清单】架构组件
- 界面
- 【专题分析】自定义View
- 【专题分析】ImageView的ScaleType属性
- 【专题分析】ConstraintLayout 使用
- 【专题分析】搞懂点九图
- 【专题分析】Adapter
- 【源码分析】LayoutInflater
- 【源码分析】ViewStub
- 【源码分析】View三大流程
- 【源码分析】触摸事件分发机制
- 【源码分析】按键事件分发机制
- 【源码分析】Android窗口机制
- 【面试清单】界面
- 动画和过渡
- 【基础知识】动画和过渡
- 【面试清单】动画和过渡
- 图片和图形
- 【专题分析】图片加载
- 【面试清单】图片和图形
- 后台任务
- 应用数据和文件
- 基于网络的内容
- 多线程与多进程
- 【基础知识】多线程与多进程
- 【源码分析】Handler
- 【源码分析】AsyncTask
- 【专题分析】Service
- 【源码分析】Parcelable
- 【专题分析】Binder
- 【源码分析】Messenger
- 【面试清单】多线程与多进程
- 应用优化
- 【专题分析】布局优化
- 【专题分析】绘制优化
- 【专题分析】内存优化
- 【专题分析】启动优化
- 【专题分析】电池优化
- 【专题分析】包大小优化
- 【面试清单】应用优化
- Android新特性
- 【专题分析】状态栏、ActionBar和导航栏
- 【专题分析】应用图标、通知栏适配
- 【专题分析】Android新版本重要变更
- 【专题分析】唯一标识符的最佳做法
- 开源库源码分析
- 【源码分析】BaseRecyclerViewAdapterHelper
- 【源码分析】ButterKnife
- 【源码分析】Dagger2
- 【源码分析】EventBus3(一)
- 【源码分析】EventBus3(二)
- 【源码分析】Glide
- 【源码分析】OkHttp
- 【源码分析】Retrofit
- 其他知识
- Flutter
- 原生开发与跨平台开发
- 整体归纳
- 状态及状态管理
- 零碎知识点
- 添加Flutter到现有应用
- Git知识
- Git命令
- .gitignore文件
- 设计模式
- 创建型模式
- 结构型模式
- 行为型模式
- RxJava
- 基础
- Linux知识
- 环境变量
- Linux命令
- ADB命令
- 算法
- 常见数据结构及实现
- 数组
- 排序算法
- 链表
- 二叉树
- 栈和队列
- 算法时间复杂度
- 常见算法思想
- 其他技术
- 正则表达式
- 编码格式
- HTTP与HTTPS
- 【面试清单】其他知识
- 开发归纳
- Android零碎问题
- 其他零碎问题
- 开发思路