0%

SSL/TLS

HTTPS 是基于 SSL/TLS 的 HTTP,要解释 HTTPS,只需要在了解 HTTP 的基础上,了解 SSL/TLS 就可以了。

HTTPS 是安全的 HTTP,其安全来自于对传输信息的加密,加密方法有可以分为对称加密和非对称加密,下面我们来看加密方法中的非对称加密,并介绍几个非对称加密的应用,如数字签名和数字证书。

非对称加密

服务器有两个密钥,一个公钥 Public Key,一个私钥 Private Key,用任意一个密钥加密的信息都能用另一个密钥解密。

一个用私钥解密公钥的例子是服务端解密客户端信息:

客户端用公钥加密信息,发送给服务器,服务器收到后用私钥解密,由于私钥只有服务器拥有,所以这个消息只对发送者和这个持有私钥的服务器可见。

数字签名

一个用公钥解密私钥的例子是数字签名

  1. 服务器给客户端发送消息时,要为这个消息签字,以证明是服务器自己发的。服务器首先用一个 Hash 函数处理要发送的消息,这会生成一个短小的串,称为消息摘要,消息摘要是不可逆的,即不能被转换回原文。
  2. 随后服务器再将消息摘要用私钥加密,加密后的结果就是数字签名
  3. 客户端收到这个消息后,首先用公钥解密数字签名,若解密成功,则证明是由持有对应私钥的服务器发送的,客户端再用相同的 Hash 函数处理收到的消息,若输出的串与服务器发送的消息摘要相同,则证明被签名的数据没有被篡改。

数字证书

服务器作为一对公钥和私钥的持有者,在生成这对钥匙后需要将公钥发送给客户端,那么如何保证服务器第一次给客户端发送公钥时,公钥不被篡改呢?

方法是通过公钥证书(也叫数字证书),什么是公钥证书呢?

公钥证书由证书颁发机构(certificate authority,CA)颁发,CA 用自己的私钥,对服务器的公钥和服务器的相关消息一起进行加密,就生成了公钥证书。

这样在服务器给客户端发送公钥时,带上公钥证书,客户端收到后用 CA 的公钥解密公钥证书,就可以看到服务器的公钥以及服务器的相关信息,客户端可以检查服务器的信息是否正确,当然这样的前提是客户端必须信任这个 CA。

一个著名的公钥加密(非对称加密)算法是 RSA,非对称加密即上文一直在阐述的公钥与私钥搭配加密解密。RSA 的非对称性基于素因数分解的困难性(Prime factorization

SSL/TLS 四次握手

SSL/TLS 的目的是协商一个会话密钥(session key)来加密 HTTP 传输的信息,一共需要四次握手:

  1. 客户端发送 ClientHello,其中包含一个客户端生成的随机数,使用的协议版本号,客户端支持的加密方法
  2. 服务器发送 ServerHello,其中包含一个服务器生成的随机数,确认双方使用的加密方法,自己的证书,以证明此消息是其本人发送的
  3. 客户端收到 ServerHello,验证证书,用对应的 CA 公钥解开证书,确认是服务器本人发送的,并取出公钥,用公钥加密一个新的随机数,发送给服务器,并告知服务器从此以后,我们的消息都将用协商好的密钥和加密方法发送
  4. 服务器收到消息后,用私钥解密随机数,并用三个随机数生成会话密钥,并也告知客户端从此以后,我服务器也要开始发密文了

至此,HTTP 报文都会被加密,协议变成了所谓的 HTTPS,但实际上是 HTTP over SSL/TLS。

参考

  1. 数字签名是什么? 阮一峰
  2. What is a Digital Signature? David Youd
  3. SSL/TLS 协议运行机制的概述 阮一峰
  4. 图解 SSL/TLS 协议 阮一峰
奥里给,老铁们,干了!