ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# 计算机网络学习之 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)