因为 http 的内容是明文传输的,会经过中间代理服务器、路由器、wifi 热点、通信服务运营商等多个物理节点,如果信息在传输过程中被劫持,传输的内容就完全暴露了,可以篡改传输的信息且不被双方察觉,这就是中间人攻击。所以需要对信息进行加密。
一个密钥,它可以对一段内容加密,加密后只能用它才能解密看到原本的内容。
传输过程:
缺陷:密钥被中间人劫持失效。
两把密钥,一把公钥、一把私钥。用公钥加密的内容用私钥才能解开,同样,私钥加密的内容只有公钥能解开。
传输过程:
中间人即使劫持到公钥也无法对传输内容解密。
缺陷:公钥可以解密从服务器传给浏览器的内容。
用两组公钥私钥
缺陷:非对称加密算法非常耗时
传输过程:
漏洞:
需要解决:在第 2 步中证明浏览器收到的公钥一定是从服务器发来的公钥,而不是中间人的假冒品。
漏洞:伪造 CA 证书。
为内容生成一份“签名”,比对内容和签名是否一致就能察觉是否被篡改。
数字签名的生成过程:
浏览器验证过程:
主要就是对数字签名进行解密。与内容做对比。
得到 [被 CA 私钥加密过的] 内容 和 数字签名。
用 CA 机构的公钥对 加密过的数字签名 解密,得到 数字签名。
由于 CA 是浏览器信任的机构,所以浏览器保有 CA 的公钥。
hash 后得到的是固定长度的信息加密解密会快很多。
浏览器保有 CA 公钥,怎么证明这个公钥是否可信?
操作系统、浏览器本身会预装一些它们信任的根证书(例如 CA 证书)。
服务器会为每个浏览器(或客户端软件)维护一个 session ID,在 TSL 握手阶段传给浏览器,密钥会缓存到 session。在会话期间不需要重复认证。