🍅一、HTTPS
🌷1. 什么是HTTPS
HTTPS
超文本传输安全协议,是HTTP+SSL/TLS
协议组成的,前面我们说过HTTP
协议在传输过程中会存在安全问题,用HTTPS
协议就是来保证数据传输安全的。
在使用HTTP
过程中具体会有如下几个安全问题:
🥇数据是通过明文传输的,会被窃取
🥈数据容易被篡改
🥉身份冒充,类似钓鱼网站攻击
🌸2. HTTPS核心思想
针对HTTP
的三个安全问题,HTTPS
为了解决这三个安全问题,抽象三个具体的解决方向
🥇数据保密性:保证数据内容在传输的过程中不会被第三方查看。
🥈数据完整性:及时发现被第三方篡改的传输内容。
🥉身份校验安全性:保证数据到达用户期望的目的地。
🌹3. 加密解决数据保密性
3.1 加密的方式
加密有两种方式:对称加密和非对称加密。
🥇对称加密
- 描述:加密和解密的密钥都是同一个,常见的加密算法DES、AES。
- 优点:加密速度快。
- 缺点:容易泄漏密钥。
🥈非对称加密
- 描述:非对称加密需要一个公钥和私钥,公钥加密的只能用私钥解密,私钥加密的只能用公钥来解密,常见的非对称加密算法
RSA
、ECC
。 - 优点:安全,秘钥不容易泄漏
- 缺点:加密速度慢
3.2 使用对称加密来解决
我们先尝试使用对称加密来解决数据的保密性
🥇 加密过程
- 客户端访问服务器,服务器生成密钥,保存在本地并且发送给客户端
- 客户端接收到这个秘钥之后保存在本地
- 后续服务器和客户端发送数据,都先通过这个密钥加密再发送给对方
🥈存在的问题
使用对称加密会存在一个问题,就是密钥泄漏,如果有中间人窃取了密钥,那么后续所有的通信数据,中间人都可以截取然后通过密钥来解密,从而获取数据。
3.3 使用非对称来解决
使用非对称加密来解决数据的保密性
🥇 加密过程
- 客户端访问服务器,服务器生成一个公钥和私钥,把私钥保存在本地,把公钥发送给客户端
- 客户端收到公钥之后保存在本地
- 客户端给服务器发送消息先用公钥加密,服务器收到之后用私钥解密,同理服务器给客户端发送数据先用私钥加密,客户端收到之后用公钥解密
🥈存在的问题
还是刚才那个问题,如果有中间人窃取了公钥,那么每次服务器发送给客户端的数据都会被窃取
但是客户端发送给服务端的数据是不会被窃取的,因为客户端使用的公钥加密,只能通过私钥解密,而私钥在服务器本地保存,不存在传输过程被窃取的问题。
为了解决这个问题,可以客户端也生成一个公钥和私钥,把公钥发送给服务器,私钥留在本地
服务器给客户端发送数据就用客户端的公钥
客户端给服务器发送数据就用服务器的公钥
但是这样也有个问题,就是非对称加密的效率很低。
3.4 对称和非对称加密结合使用
如果我们换一个思路如果是对称和非对称加密结合使用:
- 首先服务器产生了一个公和一个私钥,把公钥发送给服务器
- 客户端获取到服务器的公钥之后,先不发送数据,而是生成一个对称密钥发送给服务器
- 后续客户端和服务端的数据发送就用这个对称密钥加解密
就算是窃取了服务器发送给客户端的公钥也没有用,因为后续的加密都是通过对称密钥来加密的,而且客户端发送给服务器的密钥,中间人窃取了用公钥是无法解密的。只有服务器的私钥才能解密。
这样的话对称加密和非对称加密就可以解决数据的保密性。
但是这样也存在一个隐形的问题就是公私钥的身份证明,这个问题和身份验证是同一个问题,就在下一个章节一起介绍。
🌺4.数字证书解决身份验证问题
4.1 存在的问题
上面我们说了用对称加密和非对称加密可以解决保密性问题,但是有一个前提就是客户端收到的服务器的公钥默认是服务器的,不存在被人替换的情况。
但是实际上这种情况就会存在,中间人替换了密钥,客户端收到服务端发送的密钥都是假的,客户端实际上在和中间人通信,中间人再和服务端通信。
那么这里的核心问题就是,客户端如何确定它收到的密钥是服务端发送过来的
除此之外客户端访问的服务器是真正的服务器,而不是访问到一个冒充的服务器
针对这两个问题,我们需要有一个中间机构来证明客户端收到的公钥就是真正的公钥,客户端访问的服务器就是真正的服务器。
这个机构就是CA
机构,这个证明就是数字证书
4.2 数字证书
4.2.1 什么是CA机构
CA
也叫做证书授权中心Certificate Authority
,承担公钥体系中公钥合法性校验的责任,为每个使用公钥的用户颁发一个数字证书,数字证书的作用是证明证书中的用户合法拥有证书中的公钥。
现在有的CA
机构如Digicert
、Globalsign
等。
4.2.2 数字证书颁发过程
1.申请证书的用户把自己的公钥,证书到期时间等信息发送给CA
证书机构
2.CA
机构也有自己的公钥和私钥
3.CA
机构拿着这些信息进行生成摘要,然后通过CA
的私钥进行较密生成数字签名
4.CA
机构把信息和签名一起发送给用户
4.2.3 数字证书验证过程
当客户端访问服务器的时候,服务器就会把证书发送给客户端,那么客户端是如何验证数字证书的有效性的
1.首先浏览器和操作系统会预置一些CA
机构的公钥
在命令行输入:certmgr.msc
就可以看到所有的证书
2.浏览器收到证书后就会使用CA
的公钥把签名进行解密生成摘要
3.然后把证书进行摘要算法生成摘要,然后和解密的摘要进行对比,如果一致就说明证书是可靠的,同时也说明证书里面的服务器公钥也是可靠的。
这里我们可以看一下百度的证书,从最后一张图可以看出,证书是一个目录结构,这是因为证书都不是CA
机构直接签发的,而是CA
信任的中间机构签发的。
中间机构信任你的证书,而CA
机构信任中间机构,这样一层一层的验证。
- 点击浏览器地址栏的锁图标,选择连接是安全的
- 选择证书有效
- 在详细信息里面就可以看到证书的信息
4.3 证书
X.509
证书有两种编码方式 一种是PEM
证书格式,是Base64
格式的、这种证书可以通过文本编辑 一种是DER
证书格式,是Binary
二进制格式的
证书的后缀一般是:cer
、crt
、pem
除证书外还有个后缀是key
的文件,这个一般是公钥或则会私钥。
🌻5. 数字签名解决数据完整性
5.1 介绍
数字签名是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。
数字签名可以保证数据的完整性,防止数据被篡改,因为数字签名是通过发送的数据产生的,如果数据被修改那么就和数字签名对应不上
5.2 使用过程
😀准备工作
在服务端和客户端通信之前,服务端会生成一个公钥和私钥
😁发送公钥
服务端会把公钥发送给客户端
😂服务器生成签名
服务端在发送数据给客户端之前,要先生成数据的数字签名,生成的过程如下
🥇 对数据进行摘要算法生成摘要
🥈用私钥对摘要进行加密生成数字签名
😃封装数据
把数字签名和数据整合成新的数据
😄发送数据
把封装后的数据发送给客户端
🙂客户端验证
客户端拿到这个数据之后,通过数字签名来验证数据的完整性,验证过程如下
🥇 用公钥解密数字签名生成摘要1
🥈同时把服务器发送的数据也进行摘要算法生成摘要2
🥉判断摘要1和摘要2是否相等,如果相等那说明数据没有被篡改,如果不相等那么数据就被篡改了
🍇二、SSL/TLS
💐1. SSL/TLS 介绍
SSL(Secure Socket Layer)
安全套接层是网景公司在1994年针对http
的安全性问题提出的一套协议,在1995年发布了3.0版本TLS(Transport Layer Security)
传输层安全是IETF
在SSL3.0
基础上设计的协议。
ssl
协议分为了ssl
记录协议和ssl
握手协议
🥇 SSL
记录协议:为高层协议提供数据封装、压缩、加密等基本功能。
🥈SSL
握手协议:它建立在SSL
记录协议之上,用于在实际的数据传输开始之前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
🌽2. SSL/TLS握手过程
上面我们说了HTTPS
是通过对称加密和非对称加密来保证通信安全的,通过非对称加密来交换对称加密的秘钥,SSL
协议就是来实现这一过程的。
这里我们用wireshark
来抓一个包看看,可以筛选出ip
和ssl
,这样看起来方便一些
上面的过程用客户端和服务器来表示分为以下四个步骤
☘️1.客户端发送Client hello
客户端向服务器发送Client hello
,以明文传输,并携带以下内容
- Version:客户端支持的
TLS
版本 - Random:随机数1
- SessionID:会话
ID
- Cipher Suites:客户端支持的加密算法,这里有16种
- Compression Methods:客户端支持的压缩算法
🌱2.服务端向客户端发送Server hello
服务端向客户端发送Server hello
,以明文传输,并携带以下内容
- Version:服务端选择的TLS版本
- Random:随机数2
- Cipher Suites:选择的加密算法
- Compression Method:选定的压缩算法
🌲3.服务端给客户端发送Certificate、Server Key Exchange、Server hello done
- Certificates:服务端给客户端发送
CA
证书
- Server Key Exchange:服务端给客户端发送客户端用于生成
premaster secret
的安全参数
- Server Hello Done:表示服务端已经把密钥相关的全都发送给客户端了
🌳4.客户端给服务器发送Client Key Exchange、Change Cipher Spec、Encrypted Handshake Message
上面第三步如果客户端验证证书通过后就会进行这一步
- Client Key Exchange:客户端给服务器发送使用公钥(在
CA
证书里面,参考4.2)加密了的premaster secret
- Change Cipher Spec:因为SSL协要求客户端或服务器端每隔一段时间必须改变其加解密参数,所以这条消息通知对方下一个要传送的数据将采用新的加解密参数,也就是要求对方改变原来的安全参数
- Encrypted Handshake Message:客户端告诉服务器握手过程收到了什么数据,发送了什么数据,保证没人篡改数据
🥑3.总结
当上述握手完成后,客户端和服务端分别用:第一步的随机数1、第二步的随机数2、第四步的premaster secret
用第二步服务端选择的加密算法生成对称密钥
后续客户端和服务端的通信就用这个对称加密来进行通信
因为对称密钥的生成是用了三个随机数,并且其中两个是客户端发送给服务端的,并且第三个是用公钥加密的,只有服务器的私钥才能解密,所以不会存在不安全问题