26

这个问题与在客户端应用程序中针对 Web api 和证书到期使用 SSL Pinning 有关。

场景

我拥有example.com并有一个托管api的子域,例如:api.example.com

我希望通过SSL使用 api ,因此为子域创建了 SSL 证书。

获得证书后,我有:

  • 公共证书
  • 中级证书
  • 私钥

据我了解,我将这些证书安装在我的网络服务器上。

然后我希望我的客户端应用程序连接到 api。为了减轻中间人攻击,我希望使用 SSL Pinning,这样客户端只会与我的 api 通信,而不是有人欺骗它。

为了固定客户端应用程序,我有两个选择,固定公共证书或中间证书。

假设我实现了这个。

api.example.com上的证书过期时会发生什么?

据我了解,客户端应用程序将不再工作。

我是否需要重新生成一整套公共/中间/私人项目?然后在应用程序中放置一个新的公共或中间证书?

问题

在更新 api.example.com 上的证书之前,我仍然希望客户端应用程序能够正常工作。当然,可以将新证书放入客户端应用程序中,但推出之类的事情需要时间。

我该如何处理?

我读到谷歌每个月都会更新他们的证书,但不知何故设法保持公钥不变:如何在 iOS 上固定证书的公钥

如果这是可能的,那么解决方案是简单地从服务器中提取公钥并根据本地存储的公钥检查它......但谷歌是如何做到的呢?

谢谢

克里斯

4

3 回答 3

22

注意:我更熟悉浏览器到服务器的固定(HTTP 公钥固定 - HPKP),而不是应用到服务器的固定,但我认为主体是相同的。在 HPKP 中,固定策略由服务器作为 HTTP 标头提供,但请理解这通常内置于应用程序中,而不是从 HTTP 响应中读取。因此,请记住所有这些,阅读以下答案:

固定通常针对密钥而不是证书,并且可以是多个级别。所以你有几个选择:

  1. 重复使用相同的密钥/crt 来生成新的证书。有些人(在我看来是正确的!)建议每次更新证书时生成一个新密钥,但是当您使用固定时这很复杂。那么固定是否会鼓励不良的安全习惯,例如密钥重用?

  2. 在您的固定策略中有几个备份密钥,并在证书更新时轮换它们,丢弃最旧的并添加一个新的,有足够的时间和更新,永远不会被抓到。就我个人而言,我更喜欢在证书更新时生成密钥,而不是有一些可能或可能已经被泄露的备份,所以我也不是这个的特别粉丝。你应该有多少备份?例如,如果您因为续订方面的妥协而需要重新颁发证书并且还搞砸了?那么2?3? 100?

  3. 再往上别针。说第一个中间证书或根 CA 证书。因此,任何新颁发的证书仍然是受信任的(只要它是由相同的证书路径颁发的),这样做的缺点有四个方面:i)您仍然对由该固定证书颁发的未颁发证书持开放态度(恕我直言,这不是什么大不了的事) '仍然大大减少了您的攻击面,但仍然是某些人的担忧),ii)您不能保证客户端会使用该中间证书,因为有时有多个有效路径。这第二个是一个更大的交易。您可能认为提供中间证书可以保证使用它,但事实并非如此(大量的 sha-1 示例)。iii)不能保证新证书将由相同的中间人或根颁发(尤其是当技术发生变化时,如引入 sha2),所以对我来说,这整个选项是一个非首发 iv)它将您与使用相同的证书提供者联系起来(也许没什么大不了的,但我喜欢移动的自由)。不确定应用程序是否本机支持此功能,但浏览器肯定支持。

  4. 提前续订,在策略缓存过期之前不要使用新密钥。例如,如果您有一年的证书和 30 天的固定政策,那么您可以在 11 个月后续订,将新密钥添加到政策中,然后等待 30 天,这样您就可以确定每个人都会选择新政策或至少旧策略将过期,然后切换密钥和证书。取决于短期政策,并且可能会浪费其中的一部分(在此示例中至少为 30 天),除非证书提供商在旧政策到期后的第二天开始提前提供证书。对于应用程序,如果固定策略被硬编码到其中,那么这可能涉及推出更新所需的时间长度。

最终,因为证书确实需要更新,所以我不喜欢固定。我不认为制作需要定期更新的东西,半永久性是正确的答案甚至还有一些关于在浏览器中预加载固定策略的讨论,这让我不寒而栗。

固定可确保流氓 CA 不会为您的域颁发证书,但与固定的麻烦相比,这种可能性有多大?诸如证书透明度之类的东西 - 甚至只报告固定可能是解决该问题的更好答案,即使它们实际上并没有阻止该攻击。

最后在本地安装了根(例如用于防病毒扫描程序或公司代理),绕过固定检查(至少在浏览器上),这再次降低了它在我眼中的有效性。

因此,在使用 pinning 之前请仔细考虑,并确保您了解所有后果。

于 2016-01-02T16:36:46.170 回答
4

Mozilla 开发者网站建议固定签署服务器证书的中间 CA 的证书。

“建议将 pin 放在颁发服务器证书的 CA 的中间证书上,以简化证书的更新和轮换。”

有关实施和测试公钥固定的更多信息,您可以参考实施和测试 HTTP 公钥固定 (HPKP)

于 2017-09-25T06:03:28.223 回答
0

您的应用程序可以在其 pin 列表中存储多个证书。更改证书的程序将是:

  • 在证书到期前的某个时间,发布一个新版本的应用程序,在 pin 列表中使用替换证书以及原始证书
  • 当旧证书过期时,在服务器上替换它 - 应用程序应该仍然可以工作,因为新证书已经在 pin 列表中
  • 证书过期后的一段时间,发布您的应用程序的新版本,删除旧证书

请记住,您的用户必须在旧证书过期之前更新应用程序

于 2020-07-29T04:54:44.520 回答