一次性把 Https 说清楚

207 阅读3分钟

最近把 Https 又看一遍,加深了一下理解

HTTPS 中的 S 指什么?

我们说 https 是在 http 的基础上加了一个加密层。那个这个加密层就是 S。具体来说,指的是 SSL or TSL。这个协议是需要客户端和服务器端同时支持的。 SSL 和 TLS 的区别在于:SSL 是老版本,现在已经被 TSL 取代了,而且从 2020 以后,TSL 协议的 1.1 以下的版本在现代浏览器中会被废弃,因此服务器也必须要支持 1.1 以上的版本,从目前来看也就是 1.2 或者 1.3 这两个版本。

TLS 1.0 and 1.1 support will be removed from all major browsers in early 2020; you'll need to make sure your web server supports TLS 1.2 or 1.3 going forward. developer.mozilla.org/en-US/docs/…

换个说法:TSL 的前身就是 SSL,两者并无本质区别,都是为了解决 HTTP 的加密问题。当然,从技术深入的角度来看,两者是有很大区别的。可能从后端和运维的角度来讲,需要深入的去理解二者之间的区别,但是从前端的角度来看,不需要太深入去理解二者的区别。想详细了解二者的区别,可以看 这里,本文不详细讨论。

https 要解决 http 的什么问题(WHY)

HTTPS 解决了数据加密和身份认证两个问题。加密是初衷,而身份认证实际上是加密必不可少的一个环节。加密很容易理解,但是身份认证多说一下。 加密是保证数据不被偷听,身份认证是保证用户访问的服务器的真实性。如果没有身份认证,假设用户的 DNS 被劫持的话,用户访问的可能并不是真实的服务器网站,当用户访问的是一个钓鱼网站,那么就无法保证你的数据不会被窃取,这就是身份认证的所要解决的问题(重要性)。

https 是对称加密还是非对称加密?

两者都用到了。在 TLS 握手阶段用的是非对称加密,在业务数据传输的阶段用的是对称加密。 非对称加密保证了 master secret (盐?)的隐私性,对称加密保证了数据在服务器端和客户端加密解密的速度。 如果完全是对称加密,那么不可避免的要在传输过程中协商加密秘钥。如果在协商加密秘钥的过程中就被窃听的话,加密就没有起到效果。 所以 master secert 是需要通过非对称加密的方式协商生成,而一旦生成之后,就可以用 master secert 对数据进行加密,从而保证内容是密文,无法被破解。

生成 master-secret 的时候为什么需要 client random 和 server random?

单纯从加密的角度来说,只需要一个 pre-master 就可以了,但是为什么还需要在握手阶段明文传输 client random 和 server random 呢?client random 和 server random 明文传输是可以被中间人获取到的。这个问题的答案在这里

这个 client random 和 server random 实际上是在防止 replay attack,就是如果中间人拿到请求流量的话,尽管他不知道内容是什么,但是他可以看到 url,根据 url 可以猜测和判断你的请求是什么操作,如果是一个他认为可以攻击的流量的话,他可以重播这段流量,不停的请求服务器,让你的这个请求发生多次,从而实现多次请求。例如,用户本来只想购买一个产品,但是中间人利用重播的方式,多次请求,让服务器以为用户购买了多次这个产品。而如果需要 server random 的话,中间人的每次请求,都会返回不同的 server random,所以中间人的请求在服务端验证无法通过,就不会发生上面的情况。