一、HTTP
- 发送请求
- TCP三次握手建立连接
- 客户端发送HTTP请求,服务器返回响应的HTTP数据包,客户端解析数据包内容呈现在浏览器上
HTTP 由于是明文传输,所以在安全性上存在以下三个风险:
- 窃听风险,因为明文传输,可以直接抓包获取传输的数据,就会导致信息的泄漏。
- 篡改风险,比如强制入垃圾广告。
- 冒充风险,如搭建一个某平台的仿真网站,通过DNS欺骗诱导用户访问。
HTTPS 是如何解决上面的三个风险的呢?
- 混合加密的方式实现信息的机密性,解决了窃听的风险。
- 摘要算法的方式来实现完整性,它能够为数据生成独一无二的「指纹」,指纹用于校验数据的完整性,解决了篡改的风险。
- 将服务器公钥放入到数字证书中,解决了冒充的风险。
二、HTTPS
在HTTP基础上添加新的协议SSL(安全套接字协议层),通过对传输过程数据进行加密进来保证数据的安全性。
- Https默认使用端口443
- https是在http和tcp层中间加了ssl安全层
- ssl的四次握手是在tcp三次握手完成之后进行密钥协商的
SSL四次握手
第一次握手
1. ClienHello
- 支持的SSL最高版本
- 会话ID
- 生成随机数
randomClient
- 加密算法列表
- 压缩算法列表
第二次握手
2.1 ServerHello
- 确定SLL协议版本
- 会话ID
- 生成随机数
randomServer
- 确定加密算法
- 确定压缩算法
2.2 Server Certificate
- 第一次建立必须要有CA证书,证书中包含公钥(PUBLIC_KEY)
- 在证书生成的时候,除了有基本信息外,还有颁发机构的私钥签名,这个签名是通过对整个证书的内容(包括服务器公钥)摘要加密生成的。PRIVATE_KEY(SHA256(CA))
2.3 ServerHello Done
- 表示服务器发送结束
第三次握手
3.1 Client Key Exchange
- 查看证书的颁发机构、期限以及域名等,保证了证书本身信息合法
- 验证签名:PUBLIC_KEY(私钥签名) = SHA256(CA)
- 客户端产生一个新的随机数 (
pre-master
),并使用服务端的RSA公钥加密该随机数传给服务端。
3.2 Change Cipher Spec
- 告诉服务端开始使用加密方式发送消息。
3.3 Finished
- 客户端再发一个「Encrypted Handshake Message(Finished)」消息,把之前所有发送的数据做个摘要,再用会话密钥(master secret)加密一下,让服务器做个验证,验证加密通信是否可用,以及验证之前握手信息是否有被中途篡改过。
- 会话密钥(
master secret
)为randomClient+randomServer+ pre-master。
第四次握手
4.1 Change Cipher Spec
- 通知客户端已知后续内容要加密
4.2 Finished
- 并且将之前发送内容生成hash值一并返回给客户端,以供客户端校验;
最后,就用「会话密钥」加解密 HTTP 请求和响应了。
问题
为什么是3个随机数?
使用三个随机数,是因为 SSL 的协议默认不信任每个主机都能产生完全随机的数,如果只使用一个伪随机的数来生成秘钥,就很容易被破解。
通过使用三个随机数的方式,增加了自由度,一个伪随机可能被破解,但是三个伪随机就很接近于随机了,因此可以使用这种方法来保持生成秘钥的随机性和安全性。