我正在尝试在我的应用程序上实现证书固定。据我了解,有 3 种类型的固定可用:
- 证书固定;证书应该在应用程序中“硬编码”,并与来自服务器的证书进行比较。这有点糟糕,因为如果需要轮换证书,则需要更新应用程序。
- 公钥固定;根据我的研究,这似乎已被弃用
- SubjectPublicKeyInfo(SPKI) 固定;这是公钥的散列。这种方法的优点是,如果需要轮换证书,新证书的公钥可以保持与新证书相同,这样就不需要更新。
根据我所说的,似乎推荐的方法是 SPKI pinning。
根据用户在登录时键入的 ip,我的应用程序可以连接到多个服务器。这是我实施的想法,但我不确定它是否可行。
我将创建一个由 CA 签名的中间证书。然后创建我自己的公私钥。然后我的应用程序可以连接的每台服务器都需要我请求使用我的私钥签署他们的证书。层次结构将是 RootCertificate(由 CA 自签名),然后是我的中间证书(由 CA 签名),然后是我的应用程序可以连接的每个服务器的叶证书,由我的私钥签名。
在应用程序上,我将从我的中间证书存储公钥的哈希值。在第一次连接到随机服务器时,应用程序将获得 3 个证书:服务器证书、我的中间证书和根证书。检查哈希时会发现与我的公钥匹配。
你怎么看?这可以实施吗?我理解错了吗?这种方法容易受到中间人攻击吗?谢谢!