HTTP明文传输问题
- 窃听风险,比如通信链路上可以获取通信内容,用户号容易没。
- 篡改风险,比如强制植入垃圾广告,视觉污染,用户眼容易瞎。
- 冒充风险,比如冒充淘宝网站,用户钱容易没。
TLS协议解决HTTP风险
- 信息加密: HTTP 交互信息是被加密的,第三方就无法被窃取;
- 校验机制:校验信息传输过程中是否有被第三方篡改过,如果被篡改过,则会有警告提示;
- 身份证书:证明淘宝是真的淘宝网;
- 双方在加密应用信息时使用的是对称加密密钥,而对称加密密钥是不能被泄漏的,为了保证对称加密密钥的安全性,所以使用非对称加密的方式来保护对称加密密钥的协商,这个工作就是密钥交换算法负责的。
- RSA 密钥交换算法,来看看它的 TLS 握手过程。
RSA算法的TLS握手流程
第一次握手:
- Client Hello(TLS版本,加密套件,第1随机数)
第二次握手: - Server Hello(TLS版本,加密套件,第2随机数)
- 服务器将CA证书和公钥发送给客户端,并且回复一个Server Hello Done
第三次握手:
- 客户端会生成第三个随机数叫预主密钥,用服务器的 公钥加密该随机数,然后发送给服务器
- 客户端TLS协商没有问题了,加密可以开始
- 服务端收到加密后的预主密钥,使用自己的私钥解密,获得预主密钥(只有客户端和服务器知道该预主密钥,
除非私钥被泄露
) 双方根据已经得到的三个随机数,生成会话密钥(Master Secret),它是对称密钥,用于对后续的 HTTP 请求/响应的数据加解密。
第四次握手:
- 服务器也是同样的操作,发「Change Cipher Spec」和「Encrypted Handshake Message」消息,如果双方都验证加密和解密没问题,那么握手正式完成。最后,就用「会话密钥」加解密 HTTP 请求和响应了。
客户端验证证书
个数字证书通常包含了:
- 公钥;
- 持有者信息;
- 证书认证机构(CA)的信息;
- CA 对这份文件的数字签名及使用的算法;
- 证书有效期;
- 还有一些其他额外信息;
证书作用
- 是用来认证公钥持有者的身份,以防止第三方进行冒充。说简单些,证书就是用来告诉客户端,该服务端是否是合法的(百度是真百度不是假的),因为只有证书合法,才代表服务端身份是可信的。
证书签发流程
CA 签发证书的过程
- 首先 CA 会把持有者的公钥、用途、颁发者、有效时间等信息打成一个包,然后对这些信息进行 Hash 计算,得到一个 Hash 值;
- 然后 CA 会使用自己的私钥将该 Hash 值加密,生成 Certificate Signature,也就是 CA 对证书做了签名;
- 最后将 Certificate Signature 添加在文件证书上,形成数字证书;
客户端校验服务端的数字证书的过程
- 首先客户端会使用同样的 Hash 算法获取该证书的 Hash 值 H1;
- 通常浏览器和操作系统中集成了 CA 的公钥信息,浏览器收到证书后可以使用 CA 的公钥解密 Certificate Signature 内容,得到一个 Hash 值 H2 ;
- 最后比较 H1 和 H2,如果值相同,则为可信赖的证书,否则则认为证书不可信。
RSA 算法的缺陷
- 使用 RSA 密钥协商算法的最大问题是不支持前向保密。
- 因为客户端传递随机数(用于生成对称加密密钥的条件之一)给服务端时使用的是公钥加密的,服务端收到后,会用私钥解密得到随机数。所以一旦服务端的私钥泄漏了,过去被第三方截获的所有 TLS 通讯密文都会被破解。