这是一个很有意思的问题,前段时间在 V2 的一个帖子问到 “为什么 google 的 ssl 有效期会设置为 3
个月?”,其中就有两条回复提到了这个问题,较短期限的证书时效可以避免因私钥泄漏带来的安全问题,同时也可以在一定程度上避免你提到的这个问题。
当时觉得很有道理,不过也没有深究,刚刚去查了一下相关的资料,了解到了一些信息。
当然,实施这个的前提是,你要把这个请求导向到你的服务器,比如,你提供了一个 DNS 服务受害者使用了你的 DNS,或者修改了目标客户端的 hosts
文件?或者你提供了一个代理服务器等等中间人攻击的方式。
要解决这个问题的话,如果是 App 一类的话,其实比较常见的还是 "SSL Pinning",但是浏览器就不一样了
HTTP Public Key Pinning
在早期时候,一些浏览器支持 "HTTP Public Key Pinning",服务端在响应头中返回一个 "Public-Key-Pins"
头,其中包含了可以被信任的证书的 "pin-sha256" 哈希值,这样就可以解决你提到的这个问题,但是也挺麻烦的。
不过,因为一些其使用率较低,Chrome 67 又终止了对其的支持。(IE 等就从未实现过)
Certificate Transparency
还有另外一个东西 "Certificate Transparency"(证书透明度),这是由 Chrome 牵头发起的,并且在 Chrome
上已经被强制实施。
简单的说,就是当 CA 机构签发证书后,必须向 CT 的日志服务器提交证书信息,任何人都可以通过查阅 CT 日志来检查域名下存在的证书。
个人理解的话,如果你查到这些证书在有效期,并且确定不是你自己申请的话,可以向 CA 机构申请吊销这些证书,再结合 "OCSP Stapling"
来解决你所提到的这个问题。
参考资料
* "有关 TLS/SSL 证书的一切 | 卡瓦邦噶!" (https://link.segmentfault.com/?enc=zaAwc8h2mY9AAw%2BmiBIPQw%3D%3D.WlELHg%2FYSOl1ETNnCtuRuIPlHPhdSkXnhD%2FK3MiuiMK7nVza%2FlmOD105zjyxn4Ud)
* "Certificate Transparency 那些事 | JerryQu 的小站" (https://link.segmentfault.com/?enc=4Sz9MU4us1AOtkdmLn2aXA%3D%3D.gK%2BtpiWIbEATwR0z0oFbOjIErGVVRFGj7f0CuNl2YveEGj%2FoIWfdfjzY1ugCywOjE1AO28tfBzSXbzu5VSnwiw%3D%3D)
* "crt.sh | Certificate Search" (https://link.segmentfault.com/?enc=WhQ8B64w%2BQe64ozHwUOBYw%3D%3D.DNDSKg85bB%2F5S8gpIH1WFA%3D%3D)
* "Certificate Transparency : Certificate Transparency" (https://link.segmentfault.com/?enc=GAL1n7g8tS16MKUe8dwE1A%3D%3D.HAwNaQraNHpxYJecvBkofrNIdDhZCa28fWZ2oXSMHpfqzdNOG8IplahXzULa3yBQ)