【问题标题】:Certificate pinning mobile apps固定移动应用程序的证书
【发布时间】:2020-11-10 13:13:30
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 你实现了什么?为什么我们不应该使用公钥固定?

标签: android ios ssl certificate certificate-signing-request


【解决方案1】:

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

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

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

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

假设您的移动应用需要与example.comhttpbin.orggoogle.com 通信。

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

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

在 iOS 选项卡上:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 2018-09-11
    • 1970-01-01
    • 2019-04-28
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多