互联网|万字长文拿下HTTPS,面试不再慌!( 六 )


但又因为非对称加密效率太低 , 所以私钥只加密原文的摘要 , 这样运算量就小的多 , 而且得到的数字签名也很小 , 方便保管和传输 。
签名和公钥一样完全公开 , 任何人都可以获取 。 但这个签名只有用私钥对应的公钥才能解开 , 拿到摘要后 , 再比对原文验证完整性 , 就可以像签署文件一样证明消息确实是你发的 。

互联网|万字长文拿下HTTPS,面试不再慌!
本文插图
刚才的这两个行为也有专用术语 , 叫做签名和验签 。

只要你和网站互相交换公钥 , 就可以用签名和验签来确认消息的真实性 , 因为私钥保密 , 黑客不能伪造签名 , 就能够保证通信双方的身份 。
比如 , 你用自己的私钥签名一个消息马冬梅你别跑 。 网站收到后用你的公钥验签 , 确认身份没问题 , 于是也用它的私钥签名消息十年翻身同学会 , 拆散一对是一对 。
你收到后再用它的公钥验一下 , 也没问题 , 这样你和网站就都知道对方不是假冒的 , 后面就可以用混合加密进行安全通信了 。
数字证书和 CA:身份认证
到现在 , 综合使用对称加密、非对称加密和摘要算法 , 我们已经实现了安全的四大特性 , 是不是已经完美了呢?
不是的 , 这里还有一个公钥的信任问题 。 因为谁都可以发布公钥 , 我们还缺少防止黑客伪造公钥的手段 , 也就是说 , 怎么来判断这个公钥就是你的公钥呢?
我们可以用类似密钥交换的方法来解决公钥认证问题 , 用别的私钥来给公钥签名 , 显然 , 这又会陷入俄罗斯套娃 。

互联网|万字长文拿下HTTPS,面试不再慌!
本文插图
但这次实在是没招了 , 要终结这个死循环 , 就必须引入外力 , 找一个公认的可信第三方 , 让它作为信任的起点 , 递归的终点 , 构建起公钥的信任链 。

这个第三方就是我们常说的CA(Certificate Authority , 证书认证机构) 。 它就像网络世界里的公安局、教育部、公证中心 , 具有极高的可信度 , 由它来给各个公钥签名 , 用自身的信誉来保证公钥无法伪造 , 是可信的 。
CA 对公钥的签名认证也是有格式的 , 不是简单地把公钥绑定在持有者身份上就完事了 , 还要包含序列号、用途、颁发者、有效时间等等 , 把这些打成一个包再签名 , 完整地证明公钥关联的各种信息 , 形成数字证书(Certificate) 。
知名的 CA 全世界就那么几家 , 比如 DigiCert、VeriSign、Entrust、Let’s Encrypt 等 , 它们签发的证书分 DV、OV、EV 三种 , 区别在于可信程度 。
DV 是最低的 , 只是域名级别的可信 , 背后是谁不知道 。 EV 是最高的 , 经过了法律和审计的严格核查 , 可以证明网站拥有者的身份(在浏览器地址栏会显示出公司的名字 , 例如 Apple、GitHub 的网站) 。
不过 , CA 怎么证明自己呢?这还是信任链的问题 。

小一点的 CA 可以让大 CA 签名认证 , 但链条的最后 , 也就是「Root CA」 , 就只能自己证明自己了 , 这个就叫 「自签名证书」(Self-Signed Certificate)或者 「根证书」(Root Certificate) 。
你必须相信 , 否则整个证书信任链就走不下去了 。
互联网|万字长文拿下HTTPS,面试不再慌!
本文插图
有了这个证书体系 , 操作系统和浏览器都内置了各大 CA 的根证书 , 上网的时候只要服务器发过来它的证书 , 就可以验证证书里的签名 。

顺着证书链(Certificate Chain)一层层地验证 , 直到找到根证书 , 就能够确定证书是可信的 , 从而里面的公钥也是可信的 。
证书体系的弱点
证书体系(PKI , Public Key Infrastructure)虽然是目前整个网络世界的安全基础设施 , 但绝对的安全是不存在的 , 它也有弱点 , 还是关键的信任二字 。


推荐阅读