这是我阅读《HTTP权威指南》的总结和思考中,一系列文章的一篇,目录在这里
需求
HTTP协议是透明的,对于现代Web服务,比如支付等业务,需要一种安全机制来避免:
- 窃听风险:通讯内容被第三方窃听
- 篡改风险:第三方篡改通信内容
- 冒充风险:第三方冒充身份参与通信
因此需要一种算法来保证:
- 加密:防止第三方窃听
- 完整性:防止内容被篡改
- 服务器/客户端认证:防止身份伪造
- 效率高, 普适性强
概述
网景公司最早引入了SSL(Secure Socket Layer)来保证安全性,之后标准化组织接收基于其上推出了TLS(Transport Layer Security)
|
|
通过加入一层SSL加密处理消息以后以二进制密文发送给客户端,SSL对于上层像一个黑盒子一样,具体过程在后面探讨
基础算法
对称非公开加密
对称加密算法指的是加密和解密使用相同密钥的算法。过程示意图:
常见的算法有DES和继任者AES等
其主要优点是运算速度快,加密和解密过程不需要很长的时间,当要传输较大文件时比较方便
缺点在于
- 每个点对点传输都需要1个密钥,服务器和客户端需要保存大量的密钥
- 需要首先传输密钥给对方,可能会泄露密钥
非对称公开加密
非对称加密与对称加密特点相反,密钥分为公钥和私钥,公钥公开在某处,发送方都可以获取该密钥对信息加密,私钥只有接收方保管,可以将密文解密
|
|
上图展示了RSA算法的过程,RSA算法是最常见的非对称公开加密算法,其加解密是双向的,即私钥加密可以用公钥解密,公钥加密可以用私钥解密,在数字签名时会用到该特性
非对称加密解决了对称加密的2个缺点,但是其加密解密速度太慢,因此不适合大文件的加密传输
数字证书和数字签名
在上面两种加密算法的基础上,我们实现了防止窃听,但是还需要一个方法来防止篡改,并且证明发送方身份
数字证书是由权威机构颁发给服务器方,通常包含名称,过期时间,发布者等信息,服务器通过提供证书证明自己身份,就像人出示身份证一样
为了证明证书的可靠性,需要用到数字签名技术。证书颁发方将证书中的版本号,序列号,签名算法描述,颁发机构,对象名称,对象公钥等通过颁发者的私钥加密后生成数字签名
当客户端(浏览器)接收到服务器发来的证书后,根据颁发方的公钥(通常已预装在浏览器,对于非权威证书颁发者会出现警告),解密签名与证书对照,确认证书没有变化。
TLS过程
因为RSA效率较低,因此TLS通过握手验证服务器身份并用RSA传递一个对称密钥,之后的主体报文使用该密钥传递,会话结束后销毁
SSL握手通过4次完成
ClientHello
客户端向浏览器提供
- 支持的协议版本, TLS1.0-1.3/SSL
- 一个用于生成对称加密的随机数
- 支持的加密方法
- 压缩算法
ServerHello
服务器回复
- 确认使用的协议版本
- 第二个用于生成对称加密的随机数
- 确认使用的加密方法,比如RSA公钥加密
- 服务器证书
客户端响应
客户端回复
- 最后一个用于生成对称加密的随机数
- 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送
- 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验
服务器响应
- 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送
- 服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验
之后所有内容就交由SSL层使用对称密钥加密后传递