1. 什么是 HTTPS
此前我们详细介绍过 HTTP 协议。 HTTP 协议简介
http 协议是一种基于 TCP/IP 的应用层协议,起初是为了实现 web 的功能,如今已经成为了多种场景下多端通信的一种常用数据传输协议。 但是 http 协议是基于明文传输,存在以下风险:
- 窃听风险 — 第三方截获并查看双发发送的内容
- 篡改风险 — 第三方截获并篡改双发发送的内容
- 冒充风险 — 第三方伪装通信方与另一端通信
正是由于 HTTP 协议本身可能存在以上风险,在此基础上,Netscape 通信公司在传输层与应用层之间增加了安全套阶层 SSL(Secure Sockets Layer),他通过数据加密,实现了网络传输中数据的安全性保障,目前最为通用的是3.0版本,其继任者为1999年公布的传输层安全性协议 TLS(Transport Layer Security),目前发展到1.3版本(2018年发布) 可以参看:https://tools.ietf.org/html/rfc5246。 HTTPS 就是 HTTP SSL/TLS 而成的一整套协议的简称,通过加密、校验与身份证书,避免了 http 协议原本明文传输的潜在风险,但在通信过程中,无论是上层的 http 协议还是下层的 tcp 协议,都不需要做任何变化,因为他们并不关心传输的究竟是密文还是明文。
2. 对称加密与非对称加密
2.1. 对称加密算法
对称加密算法指的是加密与解密过程使用的是同一个秘钥。 例如最简单的异或加密算法,我们假设我们有一个数字 87 需要加密,我们的秘钥是 52,用 87 与 52 异或,我们拿到了 加密后的数字:99。 假设有人截获了传输途中的 99,在没有密钥的情况下,即使知道加密算法为异或算法,也无法计算出原值 87,而密文经网络传输到拥有密钥的另一端,通过对密文 99 执行解密操作 — 再次异或,99 与 52 异或,得到了原文 87。 当然,异或加密算法是最简单的加密算法,现实中一般是不会采用的,常用的对称加密算法有:DES、3DES、AES 等,这里就不做进一步讲解了。
2.1.1. 优点
对称加密最显著的优点是:
- 加密算法公开,实现库丰富
- 加解密过程计算量小
- 加解密速度快
- 加密效率高
2.1.2. 缺点
对称加密算法也有显著的缺点: 1. 安全性较差。 首先,密钥本身也需要在网络上的两端进行传输,如何保证密钥传输过程中不被截获呢? 其次,一方密钥丢失则整个链路不再安全。
2. 密钥维护开销大。 网络上,与多方同时通信是必不可少的场景,对称加密意味着任何两个连接都不能使用相同的密钥,那么,同时与当方通信的一端需要维护大量密钥,并且需要维护密钥与连接的对应关系,这造成了较大的负担。
2.2. 非对称加密
非对称加密与对称加密不同,他在通信的两端维护不同的密钥,分别是公钥(public key)和私钥(private key) 非对称加密算法的公钥用于加密,私钥用于解密,公钥是公开的,任何人拿到公钥都只能加密不能解密,所以他即使截获密文,也无法得到原文,只要私钥不丢失,数据在传输过程中永远是安全的,而私钥本身并不在网络上传输,从而保证了私钥的安全性。 最为常用的费对称加密算法就是 RSA 算法。
2.2.1. 优点
非对称加密最显著的优点是其安全性,同时,由于公钥完全公开,需要与多端通信的一端,只需要生成一个私钥-公钥对,然后自己保留私钥,并将公钥分发给所有调用端即可,不再需要维护大量密钥,降低了维护成本。
2.2.2. 缺点
与对称加密相比,非对称加密最显著的缺点就是加解密速度过慢,RSA 最快的情况也比 DES 慢几倍,是对应同样安全级别的对称密码算法的 1/1000 左右。 其次,非对称加密也并不能解决中间人攻击,所谓的中间人攻击指的是,A 在下发公钥给 B 时,被 C 截获,此时,C 生成一对新的公钥-私钥对,并将公钥下发给 B,并让 B 认为这是 A 的公钥,此后,每当 B 向 A 传输数据时,C 都截获数据,并用自己的私钥解密就可以得到原文,然后用此前接货的 A 的公钥加密篡改后的数据,发回给 A,就可以神不知鬼不觉的骗过两端。
3. 非对称加密如何避免自身缺点
针对上述两个缺点,非对称加密也有着下面的解决办法:
3.1. 仅加密对称加密算法密钥,再用对称加密算法秘钥加密原文
加密原文过于耗时,因此可以通过对称加密算法加密原文,再用非对称加密算法加密对称加密密钥来传输,从而保证对称加密秘钥的安全性又提升了加密性能。 但这么做的问题在于对对称加密秘钥本身安全性的要求非常高,如果对称加密秘钥本身可攻击或破解,则非对称加密算法将没有任何意义。
3.2. 对私钥进行 md5、sha1 等单向加密用于校验
由于单向加密的不可逆性,因此加密后可公开,这样与公钥一起公开,既不会影响到私钥的安全性,又可以校验确认,避免中间人攻击。 ssh 通过 rsa 认证免密登陆的过程中,有一个重要的步骤就是要求使用者确认私钥指纹(sha1 与 md5)
3.3. 使用数字签名
为了防止数据被篡改,RSA 除加解密工具外还提供了签名与验证的工具。 从原理上,签名的过程就是对发送内容摘要的解密过程,发送端生成摘要并使用私钥对摘要执行解密操作,接收端通过对解密后的密文通过公钥加密算法可以还原为摘要本身,接收端通过对比摘要来确定原文是否被篡改。
3.4. CA 认证
使用数字签名可以防止消息内容被篡改,但这仍然无法避免中间人攻击,因为作为攻击方的中间人同样可以生成一份自己篡改后的数字签名。 如何保证数字签名的有效性呢?事实上,只要能够保证接收端所持有的发送端公钥没有被篡改就可以保证通信过程不被中间人攻击,那么如何保证呢?
3.4.1. CA 认证机构
显而易见,如果有一个权威可靠的机构负责保管接收方的公钥,并且在有人请求公钥时在公钥上盖个章,获取到公钥的发送方就可以放心使用这个公钥了,这个权威机构就是 CA 机构,所谓的 CA 是 Certificate Authority 的简称,即“证书颁发机构”,而这个章,就是 CA 机构的公钥。 CA 机构通过将接收方的公钥作为原文,通过 CA 机构自身的私钥对其进行签名,发送给发送方,发送方再使用 CA 机构的公钥对签名进行验签操作,即可拿到原文,即接收方的公钥。
3.4.2. 根证书 — 如何保证 CA 的公钥不被篡改
上述流程有个关键的问题,如果 CA 下发公钥的过程被中间人攻击,并且中间人伪造身份为 CA,那整个过程仍然是不安全的。 所有信任的最源头是当面认证,而根证书则是整个信任链的源头,根证书中认证中心的各种信息以及他的公钥,如果用户手动安装一个根证书,则说明用户完全信任该 CA 机构,此后该 CA 机构传送的所有签名都认为是可信任的,同时可以通过根证书中的公钥验签来获取其内容。 操作系统、浏览器等软件在出厂时已经将许多国际通用的 CA 认证机构的根证书内置在软件内,从而不需要我们安装,这就是我们打开 https 网站看到浏览器标识该网站为“安全的”的原因,作为用户我们就可以放心浏览和访问了。
4. 完整流程
下图展示了一个可靠的非对称加密与对称加密结合的加密通信过程,这就是 SSL 的雏形。
5. SSL 协议的通信流程
SSL 协议的通信流程与我们上图最大的不同在于,在握手阶段的三次通信中,客户端服务端都会生成一个随机数,最后服务端收到三个随机数后,通过一定的算法生成对称秘钥。 这样做的目的在于:
不管是客户端还是服务器,都需要随机数,这样生成的密钥才不会每次都一样。由于SSL协议中证书是静态的,因此十分有必要引入一种随机因素来保证协商出来的密钥的随机性 对于RSA密钥交换算法来说,pre-master-key本身就是一个随机数,再加上hello消息中的随机,三个随机数通过一个密钥导出器最终导出一个对称密钥 pre master的存在在于SSL协议不信任每个主机都能产生完全随机的随机数,如果随机数不随机,那么pre master secret就有可能被猜出来,那么仅适用pre master secret作为密钥就不合适了,因此必须引入新的随机因素,那么客户端和服务器加上pre master secret三个随机数一同生成的密钥就不容易被猜出了,一个伪随机可能完全不随机,可是是三个伪随机就十分接近随机了,每增加一个自由度,随机性增加的可不是一
那么,如何配置我们的服务器生成 ssl 私钥与公钥,在此之后又需要如何配置 ssl 服务才能让我们的网站通过安全的 https 协议提供服务呢? 下一篇文章我们来详细介绍。