1

我正在尝试在我的应用程序上实现证书固定。据我了解,有 3 种类型的固定可用:

  • 证书固定;证书应该在应用程序中“硬编码”,并与来自服务器的证书进行比较。这有点糟糕,因为如果需要轮换证书,则需要更新应用程序。
  • 公钥固定;根据我的研究,这似乎已被弃用
  • SubjectPublicKeyInfo(SPKI) 固定;这是公钥的散列。这种方法的优点是,如果需要轮换证书,新证书的公钥可以保持与新证书相同,这样就不需要更新。

根据我所说的,似乎推荐的方法是 SPKI pinning。

根据用户在登录时键入的 ip,我的应用程序可以连接到多个服务器。这是我实施的想法,但我不确定它是否可行。

我将创建一个由 CA 签名的中间证书。然后创建我自己的公私钥。然后我的应用程序可以连接的每台服务器都需要我请求使用我的私钥签署他们的证书。层次结构将是 RootCertificate(由 CA 自签名),然后是我的中间证书(由 CA 签名),然后是我的应用程序可以连接的每个服务器的叶证书,由我的私钥签名。

在应用程序上,我将从我的中间证书存储公钥的哈希值。在第一次连接到随机服务器时,应用程序将获得 3 个证书:服务器证书、我的中间证书和根证书。检查哈希时会发现与我的公钥匹配。

你怎么看?这可以实施吗?我理解错了吗?这种方法容易受到中间人攻击吗?谢谢!

4

1 回答 1

0

根据用户在登录时键入的 ip,我的应用程序可以连接到多个服务器。这是我实施的想法,但我不确定它是否可行。

我会创建一个由 CA 签名的中间证书。然后创建我自己的公私钥。然后我的应用程序可以连接的每台服务器都需要我请求使用我的私钥签署他们的证书。层次结构将是 RootCertificate(由 CA 自签名),然后是我的中间证书(由 CA 签名),然后是我的应用程序可以连接的每个服务器的证书,由我的私钥签名。

在应用程序上,我将从我的中间证书存储公钥的哈希值。在第一次连接到随机服务器时,应用程序将获得 3 个证书:服务器证书、我的中间证书和根证书。检查哈希时会发现与我的公钥匹配。

我会简化这种方法,只需锁定每个后端服务器,Mobile Certificate Pinning Generator工具可以帮助您提取多个域/ips 的 pin,同时生成正确的 pinning 配置以在AndroidiOS中使用。

假设您的移动应用程序需要与和example.com通信。httpbin.orggoogle.com

只需在“配置”选项卡中配置您要固定的域:

配置选项卡

提交表单后,您将进入结果选项卡,然后如果您导航到 Android 选项卡:

Android 网络安全配置文件

在 iOS 选项卡上:

iOS info.plist 固定配置

在每个配置下方,您都有如何将每个配置添加到您的移动项目中的说明,甚至还有指向 Github 上使用适用于AndroidiOS的 Pin 测试应用程序的分步教程的链接。

固定每个后端证书的好处是,您现在可以让每个人使用 LetsEncrypt 自动生成他们的证书,在续订之间保留公钥,因此无需更改移动应用程序中的 pin,除非私钥泄露发生。您可以将 LetsEncrypt 替换为允许您在保持相同公钥的同时轮换证书的任何内容。

于 2021-10-21T11:16:14.423 回答