# 计算机网络学习之 Https 相关
## 一、前言
上一篇写了关于 HTTP 相关的知识,还没看的最好先去看下 [计算机网络学习之 http 相关](https://blog.csdn.net/Sean_css/article/details/94034740)。
其实 HTTPS 协议只是在 HTTP 的应用层中,多加了个 SSL/TLS 协议,对比图如下:
![](https://user-gold-cdn.xitu.io/2019/6/30/16ba69156aa7255b?w=2156&h=1544&f=png&s=523810)
也就是说 HTTPS = HTTP + SSL/TLS
这里先有个大致的了解就行,接下来具体看下 HTTPS:
## 二、HTTPS 简介
### 为什么要使用 HTTPS?
HTTP 协议是不加密的,数据在传输中是明文的,存在被消息被篡改、被监听、被伪造的可能,也就造成了潜在的安全隐患。
为了保证互联网数据传输中的安全性,所以在 HTTP 协议中加入了一层 SSL/TLS 协议,就是现在我们说的 HTTPS ,HTTPS 能够使数据在传输的过程中是加密的,保证数据安全。
### HTTP 和 HTTPS 的区别
1. HTTP 数据明文传输,HTTPS 数据加密传输
2. HTTP 不需要证书,HTTPS 需要申请 CA 证书
3. HTTP 默认80端口,HTTPS 默认 443 端口
4. HTTPS 比 HTTP 安全,因为比 HTTP 多了 SSL 层
### SSL/TLS
SSL协议(Secure Sockets Layer)翻译就是 安全套接字层,TLS(Transport Layer Security )是在 SSL 演变过程中的生成的,也就是 TLS 是 SSL 的新版本。
客户端和服务端在交互的过程中,都要通过 TLS 层进行加密和解密,从而保证了数据的安全传输和完整传输。
SSL/TLS 也会进行握手操作,成为 SSL 握手。SSl 握手是在 HTTP 三次握手以后进行的,所以 SSl 握手过程是不安全的,所以在这种情况下就需要借助数字证书来保证 SSL 握手的正确性,但是要注意的是,SSL/TLS 协议不仅仅适用于 HTTP协议,是可以用于任何应用层的协议的。
数字证书简称为 CA,是由权威机构发布的,也就是讲数字证书是可以被我们所信赖的,如果要使用 HTTPS 的话,就需要去证书机构申请证书,大致流程如下:
1. 公司向证书机构 CA 申请证书,并把自己服务器的公钥交给证书机构
2. CA 根据公司提供的信息,会决定要不要给其颁发证书,如果确认颁发证书,就把公司的公钥放入证书之中,并且用自己的私钥进行加密,交给服务器。
3. 然后客户端在完成三次握手以后会和服务器进行 SSL 握手,拿到服务器返回的证书进行校验,通过后才可以进行加密传输。
## 三、HTTPS 握手过程
![](https://user-gold-cdn.xitu.io/2019/6/30/16ba69156a9fb8b8?w=1864&h=1756&f=png&s=674907)
### 1.Client Hello
![](https://user-gold-cdn.xitu.io/2019/6/30/16ba69156aa5b7ce?w=2664&h=1544&f=png&s=569953)
![](https://user-gold-cdn.xitu.io/2019/6/30/16ba69156ac537bc?w=2416&h=1164&f=png&s=392233)
第一次客户端通过 Client Hello 消息把随机数(称为 Random1)、Session ID 支持的加密算法发送给服务器
### 2.Server Hello
![](https://user-gold-cdn.xitu.io/2019/6/30/16ba69156ab0be58?w=2686&h=1422&f=png&s=459427)
服务器确定好定本次通信采用的SSL版本和加密算法,如果服务器允许客户端在以后的通信中重用本次会话,则服务器会为本次会话分配会话ID,生成服务器的随机数 (称为 Random2)最终都通过 Server Hello 发送给客户端
### 3.Certificate, Certificate Status, Server Key Exchange, Server Hello Done
![](https://user-gold-cdn.xitu.io/2019/6/30/16ba69156ad1dc09?w=2682&h=1596&f=png&s=511780)
这步的主要作用就是吧把证书等信息发送给客户端。
### 4.Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message
![-w1345](https://user-gold-cdn.xitu.io/2019/6/30/16ba73f2603c669c?w=2690&h=1554&f=jpeg&s=646835)
Client Key Exchange 是在校验通过以后,客户端又生成一个随机数(Random 3),利用证书中的公钥对其进行加密,告诉服务端。
**这个时候客户端已经有Random1、Random2、Random3三个随机数。**
Change Cipher Spec 客户端发送消息,通知服务器后续报文将采用协商好的密钥和加密套件进行通信 。
Encrypted Handshake Message 客户端计算已交互的握手消息(除Change Cipher Spec消息外所有已交互的消息)的 Hash 值,利用协商好的密钥和加密算法处理 Hash 值(计算并添加MAC值、加密等),并通过 Encrypted Handshake Message 消息发送给 服务器。服务器利用同样的方法计算已交互的握手消息的Hash值,并与 Encrypted Handshake Message 消息的解密结果比较,如果二者相同,且MAC值验证成功,则证明密钥和加密套件协商成功。
### 5.Change Cipher Spec, Encrypted Handshake Message
![-w1336](https://user-gold-cdn.xitu.io/2019/6/30/16ba73f260aa9016?w=2672&h=1416&f=jpeg&s=563421)
服务器通过自己的私钥对客户端传来的数据进行解密,得到 Random3。
**这样服务端也有Random1、Random2、Random3三个随机数。**
这个时候客户端和服务端都有Random1、Random2、Random3三个随机数,然后服务器发送Change Cipher Spec消息,通知客户端后续报文将采用协商好的密钥和加密套件进行通信。
Encrypted Handshake Message 服务器计算已交互的握手消息的Hash值,利用协商好的密钥和加密套件处理Hash值(计算并添加MAC值、加密等),并通过 Encrypted Handshake Message 消息发送给客户端。客户端利用同样的方法计算已交互的握手消息的Hash值,并与Encrypted Handshake Message消息的解密结果比较,如果二者相同,且MAC值验证成功,则证明密钥和加密套件协商成功。
**通过上面的步骤,客户端和服务端都使用 Random1、Random2、Random3三个随机数 根据商定好的规则,生成对称秘钥(master secret),各自保存在本地,用该秘钥加密接下来的数据。**
### 6.正常通信
![-w1345](https://user-gold-cdn.xitu.io/2019/6/30/16ba73f261e2d071?w=2690&h=1178&f=jpeg&s=565202)
前面完成了 SSL 握手操作,这里就可以利用刚才协商好的秘钥进行数据的加密传输。
## 四、最后
HTTP 相关的知识就先了解这么多,先大体知道是个什么样的流程,后面有空再深入的研究吧。
[参考 1](https://www.jianshu.com/p/7158568e4867)
[参考 2](http://vinc.top/2017/02/11/https%E6%8F%A1%E6%89%8B%E8%BF%87%E7%A8%8B/)
[参考 3](https://www.ruanyifeng.com/blog/2014/02/ssl_tls.html)
欢迎关注我的公众号:
![我的公众号](https://user-gold-cdn.xitu.io/2019/6/28/16b9dd045d949656?w=1168&h=432&f=png&s=116859)
- Java 面试题
- String、StringBuffer、StringBuilder 的区别?
- Java 中的四种引用
- 接口和抽象类的本质区别
- 集合框架
- 集合概述
- ArrayList 源码分析
- LinkedList 源码分析
- HashMap 源码分析
- LinkedHashMap 源码分析
- Android提供的 LruCache 的分析
- LinkedList 和 ArrayList 的区别
- 多线程
- 实现多线程的几种方式
- 线程的几种状态
- Thread 的 start() 和 run() 的区别
- sleep() 、yield() 和 wait() 的区别 ?
- notify() 和 notifyAll() 的区别?
- 保证线程安全的方式有哪几种?
- Synchronized 关键字
- volatile 和 synchronized 的区别?
- 如何正确的终止一个线程?
- ThreadLocal 原理分析
- 线程池
- 多线程的三个特征
- 五种线程池,四种拒绝策略,三种阻塞队列
- 给定三个线程如何顺序执行完以后在主线程拿到执行结果
- Java 内存模型
- 判定可回收对象算法
- equals 与 == 操作符
- 类加载机制
- 类加载简单例子
- 算法
- 时间、空间复杂度
- 冒泡排序
- 快速排序
- 链表反转
- IO
- 泛型
- Kolin 面试题
- Android 面试题
- Handler 线程间通信
- Message、MessageQueue、Looper、Handler 的对象关系
- Handler 使用
- Handler 源码分析
- HandlerThread
- AsyncTask
- IntentService
- 三方框架
- Rxjava
- rxjava 操作符有哪些
- 如何解决 RxJava 内存泄漏
- Rxjava 线程切换原理
- map和 flatmap 的区别
- Databinding引起的 java方法大于 65535 的问题
- Glide
- Glide 的缓存原理
- Glide 是如何和生命周期绑定的?不同的Context 有什么区别?
- Glide 、Picasso 、的区别,优劣势,如何选择?
- Jetpack
- 源码分析
- EventBus
- EventBus 源码分析
- RxBus 替代 EventBus
- OkHttp
- OkHttp 源码分析
- OkHttp 缓存分析
- RxPermission
- RxPermission 源码分析
- Retrofit
- create
- Retrofit 源码分析
- 优化
- 启动优化
- 布局优化
- 绘制优化
- 内存优化
- 屏幕适配
- 组件
- Activity
- Frgment
- Service
- ContentProvider
- BroadcastReceiver
- 进程间通信
- Binder机制和AIDL
- AILD 中的接口和普通的接口有什么区别
- in、out、inout 的区别
- Binder 为什么只需要拷贝一次
- 在android中,请简述jni的调用过程
- 生命周期
- Activity 生命周期
- Fragment 生命周期
- Service 生命周期
- onSaveInstanceState() 与 onRestoreIntanceState()
- 前沿技术
- 组件化
- 模块化
- 插件化
- 热更新
- UI - View
- Android 动画
- 事件分发机制
- WebView
- 系统相关
- 谈谈对 Context 的理解
- Android 版本
- App应用启动流程
- App 的打包
- App 的加固
- App 的安装
- Activity 启动流程
- ClassLoader
- Lru 算法加载 Bitmap 三级缓存原理
- Parcelable 和 Serializable 的区别
- Activity的启动流程
- 相关概念
- 网络相关
- Http
- Https
- Http 和 Https 的区别
- 为什么要进行三次握手和四次挥手?
- OkHttp使用Https访问服务器时信任所有证书
- 设计模式
- 单例模式
- 构建者模式
- 工厂模式
- 外观模式
- 代理模式