目前有个需求是防抓包,同时要支持证书无缝升级。(每年都要换一次证书<del>万恶之源</del>,而且运维人员换证书可能不会提前和你说。而且保证存量用户不影响升级)
我的想法是限定 root CA 证书指纹,这样即使证书升级也能无缝切换,也能防止抓包。
目前的证书链是这样的
CA -> CA2-> AA
-
最开始的想法: 比对下 CA 的 hash, 和 AA 证书的 SAN(Subject Alternative 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 自己抓包。