技术解析

请问 app 端如何做证书绑定?(支持无缝升级)
0
2021-06-02 16:43:39
idczone

目前有个需求是防抓包,同时要支持证书无缝升级。(每年都要换一次证书万恶之源,而且运维人员换证书可能不会提前和你说。而且保证存量用户不影响升级)

我的想法是限定 root CA 证书指纹,这样即使证书升级也能无缝切换,也能防止抓包。

目前的证书链是这样的
CA -> CA2-> AA

  1. 最开始的想法: 比对下 CA 的 hash, 和 AA 证书的 SAN(Subject Al国外服务器ternative Name)。 hash 在白名单并且 SAN 匹配域名那就通过。

    后来发现,同样在 CA 申请的合法证书 BB.com 放在 Charles 里面竟然也能通过验证,
    浏览器看了下,显示的结构变成
    CA -> CA2 -> BB -> AA1

  2. 好,再改,将 SAN 验证从叶子到 root 一路验证, 凡是有 SAN 字段的,就验证 SAN,如果不匹配就报错。

  3. 然后我想到一点,如果对方从 CA2 申请一个不含 SAN 的证书,岂不是又可以跳过? 我尝试了下, 申请了一个用于代码签名的 证书 CC 放到 Charles 里面,又能跳过验证了。岂可修!!!(当然,浏览器报错)

    CA -> CA2 -> CC -> AA2

卡住了,请教各位,下面该怎么走呢?

对了,有时加一个自签名 ca 作为白名单,方便出 bug 自己抓包。


你的 app 是啥技术开发的,发送 http 请求用的是啥库

原生的 nsurlconnection,和用什么库有关系?

一般就是你自己传一套根证书列表给你的 http client 库就行了,让它别信任系统内置的证书库

要无缝升级一般就是 PIN 中间 CA 的指纹就行了。至于用相同中间 CA 签发的其他证书,虽然能过 CA Pin 但是过不了证书有效性验证啊,SAN 是不符的。至于没有 SAN,不符合 X.509 证书规范,正规 CA 不会签出来这种证书。

防抓包不太可能

一般人不会抓包,抓包的肯定不是一般人.防不住的,增加一点点时间成本而已

你也说了,成本问题,我相信我的接口不值得花这么大成本的,嘿嘿
数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服