# HTTPS
HTTPS就是HTTP的加密版本。通常使用SSL(第三方证书)或者TLS(安全传输层协议)来实现,目前使用比较多的是SSL。
可以简单的理解为:使用HTTP就像是两个人明文写信,信的内容很可能被人给看到。使用HTTPS就像把信放在保险箱中,然后再把保险箱交给收信人,而密码只有你们两个人知道(真实的HTTPS使用非对称加密)。 维基百科 介绍 (opens new window)
# HTTPS加密流程
HTTPS协议默认端口443
- 客户端:返回
支持的算法列表
、一个随机数
给服务端(随机数用作后续生成MAC密钥) - 服务端:返回
SSL证书
、一个随机数
给客户端(随机数用作后续生成MAC密钥) - 客户端:
获取证书中的公钥
、生成一个pre_master_secret随机密码串
(使用证书中的公钥
对其进行加密),然后将加密后的pre_master_secret
返回给服务器 - 客户端和服务端:根据
pre_master_secret
、客户端随机数
、服务端随机数
用同样的规则计算出MAC密钥
(后续对话使用这个MAC密钥
进行对称加密
数据传输),握手过程就结束了
# SSL证书包含什么?
- 证书的发布机构CA
- 证书的有效期
- 公钥(这里的公钥被证书颁发机构的私钥加密过)
- 证书所有者
- 签名
- 其它
# 获取SSL证书中的公用密钥的过程
验证CA机构合法
- 客户端接收到证书后,根据证书中记录的机构,从操作系统中取出内置在系统中对应的机构,验证机构是否合法
解密数据
- 根据证书的CA机构,从本地OS中取出对应的CA公钥(证书里的信息被CA私钥加密)
- 用CA公钥,对证书里的签名解密,得出hashA(签名其实就是CA把证书通过hash函数计算出的hash值,用来判断证书有没有被中间篡改过)
- 客户端用约定的hash算法根据证书的内容得出一个hashB
验证数据是否被篡改
- hashA与hashB对比,结果一致,则证明数据有效(没有被中间篡改过)
获取公钥
- 获取证书中的服务器公钥,用于后续生成对称加密密钥