前言
随着互联网的越来越深入发展,科技的进步、5G的即将到来,现在对于制作网站的质量要求也要提升上来了,其中一项安全控制手段就是传输访问协议用HTTPS取代传统的HTTP。我相信作为开发人员几乎都听说过HTTPS, 且一说到HTTPS都能说出比HTTP安全这个特点。但实际上为什么安全?安全的原理是啥?这就很少有人能够娓娓道来了,而这也就是本文的价值所在。
什么是HTTPS?
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer 或 Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL,用于安全的HTTP数据传输。
为什么要用HTTPS?
首先肯定是要了解HTTP存在的不足与HTTPS的优点
HTTP存在的不足
- 通信内容明文传输,容易被第三方窃听
- 容易被第三方劫持、篡改从而无法保证内容的完整性与正确性
- 不验证通信方的身份,因此有可能遭遇伪装,无法保证信息的来源
既然HTTP存在这些问题,那么HTTPS就是为了解决这些问题的。
HTTPS的优点
- 通信内容进行加密,防止信息在传输过程中泄露
- 保证数据完整性、准确性
- 对数据来源进行验证,确保来源无法伪造
所以,这一切的具体流程是什么呢?下面揭晓:
HTTPS工作流程
要理解HTTPS工作流程,首先要知道以下几个知识点:
- HTTP
- SSL
- 对称加密
- 非对称加密
- 混合加密
- 数字签名与验签
- CA证书
最后把这些知识点串连起来就能彻底搞懂HTTPS的工作流程了。
HTTP
超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法。SSL
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。SSL协议可分为两层:
- SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。
- SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
总的来说,SSL就是一个提供数据加解密、身份认证、协商加密算法的角色。
- 对称加密
加密与解密都用同一个密钥的过程就是对称加密
伪代码如下
// 加密函数 c1,传入明文src 与密钥key 得到加密后的结果res
const c1 = (src, key) => {
...加密流程
return res
}
// 解密函数c2, 传入密文res 与密钥key 得到解密后的明文src
const c2 = (res, key) => {
...解密流程
return src
}
- 非对称加密
分为两个密钥:公钥、私钥; (公钥 !== 私钥)
加密时: 用 公钥publicKey 对 明文src 进行加密得到 加密结果res
解密时: 用 私钥privateKey 对 加密结果res 进行解密 得到 明文src
伪代码如下
// 加密函数 c3,传入明文src 与公钥publicKey 得到加密后的结果res
const c3 = (src, publicKey) => {
...加密流程
return res
}
// 解密函数c4, 传入密文res 与私钥privateKey 得到解密后的明文src
const c4 = (res, privateKey) => {
...解密流程
return src
}
- 混合加密
其实就是对称加密 与非对称加密 一起用,HTTPS的传输过程就是这种方式
怎么用呢?具体过程是
1、A:利用非对称加密方式的公钥将“对称加密要用到的密钥key” 进行加密,传给B
2、B:利用非对称加密方式的私钥解密 得到 “对称加密要用到的密钥key”
3、B:得到 “对称加密要用到的密钥key”后利用这个key 对真正要传输的明文src进行对称加密,传给A
4、A:用对称加密方式的密钥key对明文进行解密,得到明文src
最终传输过程都是利用对称加密方式进行加密,这样做的目的是防止第三方篡改窃听明文内容。但是还有一个问题:无法确定第1步里面的A是合法者还是伪造者。
所以就只要保证第一步的A是合法者就ok了。怎么保证?下面就要引入CA概念了,在引入CA之前我们还要了解一下签名与验签是怎么回事
- 签名与验签
签名:用私钥privateKey 对明文 src1 进行加密得到 签名结果: res,然后将res 与 src1 传给拥有公钥的人进行验签
验签:用公钥publicKey 对 签名结果 res 进行解密得到明文 src2 如果 src2 === src1 就表示验签成功
私钥只有一方知道, 而公钥可以N方知道,1对N的场景就适用1 server 对 N client, 想要具体了解用法可以参考我另外一篇文章 保证http请求传输过程防篡改:RSA算法的签名与验签
- CA
证书颁发机构(Certificate Authority,简称CA),CA数量并不多,客户端(浏览器)内置了所有受信任CA的证书。CA的主要作用就是对公钥(和其他信息)进行数字签名后生成证书。
把这些知识点串连起来就是HTTPS的工作流程了
- 运维同学向第三方机构CA提交公钥、组织信息、个人信息(域名)等信息并申请认证;
- CA通过线上、线下等多种手段验证申请者提供信息的真实性,如组织是否存在、企业是否合法,是否拥有域名的所有权等;
- 如信息审核通过,CA会向申请者签发认证文件-证书。证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构 CA的信息、有效时间、证书序列号等信息的明文,同时包含一个签名。 其中签名的产生是这样子的:1,使用散列函数对公开的明文信息(公钥和其他信息)进行计算得到信息摘要,2,采用 CA的私钥对信息摘要进行加密得到密文,这个密文就是签名;
- 客户端 Client 向服务器 Server 发出请求时,Server 返回证书文件;
- 客户端 Client 读取证书中的相关的明文信息(公钥和其他信息),采用相同的散列函数计算得到信息摘要,然后,利用对应 CA的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性,即证明服务器的公钥是值得信赖的。这样就可以达到了上面混合加密说到的第1步的目的。
总结
以上就是HTTPS的原理与及相关流程,下面再通过一张图来巩固一下。如有疑惑或者不对请指出来,不胜感激,谢谢。
参考文献:
https://juejin.im/post/5ca6a109e51d4544e27e3048
https://baike.baidu.com/item/https/285356?fr=aladdin