技术解析
目前有个需求是防抓包,同时要支持证书无缝升级。(每年都要换一次证书万恶之源,而且运维人员换证书可能不会提前和你说。而且保证存量用户不影响升级)
目前的证书链是这样的
CA -> CA2-> AA
最开始的想法: 比对下 CA 的 hash, 和 AA 证书的 SAN(Subject Al国外服务器ternative Name)。 hash 在白名单并且 SAN 匹配域名那就通过。
后来发现,同样在 CA 申请的合法证书 BB.com 放在 Charles 里面竟然也能通过验证,
浏览器看了下,显示的结构变成
CA -> CA2 -> BB -> AA1
好,再改,将 SAN 验证从叶子到 root 一路验证, 凡是有 SAN 字段的,就验证 SAN,如果不匹配就报错。
然后我想到一点,如果对方从 CA2 申请一个不含 SAN 的证书,岂不是又可以跳过? 我尝试了下, 申请了一个用于代码签名的 证书 CC 放到 Charles 里面,又能跳过验证了。岂可修!!!(当然,浏览器报错)
CA -> CA2 -> CC -> AA2
对了,有时加一个自签名 ca 作为白名单,方便出 bug 自己抓包。