前言
HTTP 采用明文传输信息,存在信息监听、信息篡改和信息劫持的风险,而增加了 TLS/SSL 协议的 HTTPS 具有身份认证、信息加密和完整性校验的功能。
安全层的主要职责是:对发起 HTTP 请求的数据进行加密操作、对接收到的 HTTP 请求进行解密操作
TLS/SSL 工作原理
TLS/SSL 全称安全传输层协议,是介于 TCP 和 HTTP 之间的一层安全协议,不影响原有的 TCP 协议和 HTTP 协议,所以使用 HTTPS 基本不需要对 HTTP 页面进行很多改造。
TLS/SSL 的功能实现主要依赖三类基本算法:非对称加密、对称加密、hash散列。
非对称加密
非对称加密指,我们同时有两种秘钥:公钥和私钥,私钥我们自己保存,公钥公布出去。任何想和我们通信的客户可以使用我们公开的公钥对数据进行加密,这样我们收到数据后就可以用私钥进行解密。而客户也可以用公钥对我们用私钥加密的信息进行解密。
常见的非对称加密有:RSA、ECC、DH等。
特点:信息一对多、计算复杂、加密速度慢。
对称加密
对称加密算法指,双方使用同一个秘钥进行数据加密和解密。但是秘钥需要通过网络传输,一旦秘钥被他人获取到,那么加密就毫无作用了。
常见的加密算法:AES-CBC、DES、3DES等。
特点:消息传输一对一,需要共享相同的秘钥。服务器和 n 个客户端通信就需要维护 n 个秘钥。
hash 散列
由于信息传输过程中是明文传输,中间人可以修改信息后重新计算信息的摘要,所以需要对传输的信息和信息摘要进行加密。
特点:单向不可逆、输出长度固定、任何数据修改都会改变散列结果。
数字证书(CA 证书)
服务器首先使用一种 hash 算法来对公钥和其他信息进行加密,生成一个信息摘要。然后让有公信力的认证中心(简称 CA)用他的私钥对消息摘要加密,形成签名。最后将原始的信息和签名合在一起,称为数字证书。
校验方式
当浏览器接受到数字证书的时候,先根据原始信息使用相同的 hash 算法生成一个摘要,然后使用认证中心的公钥对数字证书的签名进行解密,最后将解密的摘要和生成的摘要进行对比,就可以发现得到的信息是否被更改了。
浏览器会内置一些顶层认证中心的证书和公钥。
图解
HTTPS通信过程
客户端发送请求(ClientHello)
- 支持的协议版本,比如 TLS 1.0 。
- 客户端生成的随机数,用于之后生成对话秘钥。
- 支持的加密方法,比如 RSA 。
- 支持的压缩方法。
这里需要注意的是,客户端发送的信息之中不包括服务器的域名。也就是说,理论上服务器只能包含一个网站,否则会分不清应该向客户端提供哪一个网站的数字证书。这就是为什么通常一台服务器只能有一张数字证书的原因。
对于虚拟主机的用户来说,这当然很不方便。2006年,TLS协议加入了一个Server Name Indication扩展,允许客户端向服务器提供它所请求的域名。
服务器回应(ServerHello)
- 确认使用的协议版本。如果浏览器和服务器支持的版本不一致,服务器就会关闭加密通信。
- 服务器生成的随机数,用于之后生成对话秘钥。
- 确认使用的加密方法。
- 服务器证书。
除了上面这些信息,如果服务器需要确认客户端的身份,就会再包含一项请求,要求客户端提供“客户端证书”。比如,金融机构往往只允许认证客户连入自己的网络,就会向正式客户提供USB密钥,里面就包含了一张客户端证书。
客户端回应
客户端收到服务器发来的证书后,会首先校验证书。如果不是可信机构颁布、证书中的域名与实际域名不一致、或者证书已经过期,都会向访问者显示一个警告,告诉其是否还要继续通信。
- 一个随机数,又称 pre-master key。
- 编码变动通知,表示之后的信息都将用双方协定的加密方法和秘钥发送。
- 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时是前面发送所有内容的hash值,用于服务器校验。
为什么需要 pre-master key ?
"不管是客户端还是服务器,都需要随机数,这样生成的密钥才不会每次都一样。由于SSL协议中证书是静态的,因此十分有必要引入一种随机因素来保证协商出来的密钥的随机性。
对于RSA密钥交换算法来说,pre-master-key本身就是一个随机数,再加上hello消息中的随机,三个随机数通过一个密钥导出器最终导出一个对称密钥。
pre master的存在在于SSL协议不信任每个主机都能产生完全随机的随机数,如果随机数不随机,那么pre master secret就有可能被猜出来,那么仅适用pre master secret作为密钥就不合适了,因此必须引入新的随机因素,那么客户端和服务器加上pre master secret三个随机数一同生成的密钥就不容易被猜出了,一个伪随机可能完全不随机,可是是三个伪随机就十分接近随机了,每增加一个自由度,随机性增加的可不是一。"
服务器响应
- 编码改变通知,表示之后的信息都将使用双方商定的加密方法和秘钥发送。
- 服务器捂手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的 hash 值,用于客户端校验。
HTTPS 的优缺点
优点
- 可以认证用户和服务器,确保数据在正确的用户和服务器之间传输。
- 可以加密传输、身份认证,使通信更安全,防止数据在传输过程中被窃听、修改。
- 现行架构下最安全的解决方案,虽不是绝对安全,但是大大增加了中间人攻击的成本。
缺点
- 客户端和服务器都需要加密和解密的处理,耗费更多的服务器资源。
- 握手阶段费事,增加页面加载时间。
- SSL 证书收费,功能越强大的证书费用越高。
- 链接服务器资源占用高,需要给服务器投入更高的成本。
- 在不支持 SNI 的服务器上,只能绑定一个 SSL 证书。