SSL Pinning和证书到期

31

这个问题涉及在客户端应用程序中针对Web API和证书到期使用SSL Pinning。

场景:

我拥有example.com,并拥有一个子域名,在该子域名上托管了一个api,即:api.example.com

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

获得证书后,我有:

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

我理解我需要在我的Web服务器上安装这些证书。

然后,我希望我的客户端应用程序连接到API。为了减轻中间人式攻击,我希望使用SSL Pinning,以便客户端仅与我的API通信,而不是与某个伪造的API通信。

为了在客户端应用程序中执行“Pin”,我有两个选择,要么针对公共证书,要么针对中间证书。

假设我实现了这个方法。

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

我理解客户端应用程序将无法正常工作。

我需要重新生成一组完整的公共/中间/私有项吗?然后将新的公共或中间证书放入应用程序中?

问题:

我仍然希望在api.example.com上的证书更新之前,客户端应用程序能够正常工作。当然,可以在客户端应用程序中放置新证书,但是这样做需要时间。

该怎么处理?

我读过Google每月更新他们的证书,但是以某种方式成功地保持了公钥不变:How to pin the Public key of a certificate on iOS

如果这是可能的,则解决方案是简单地从服务器提取公钥,并将其与本地存储的公钥进行比较 ... 但是Google是如何做到的呢?

感谢

克里斯

3个回答

29
注意:我对浏览器到服务器的固定(HTTP公钥固定- HPKP)比应用程序到服务器的固定更熟悉,但我认为原则是相同的。在HPKP中,固定策略由服务器作为HTTP标头提供,但理解这通常是内置于应用程序而不是从HTTP响应中读取的。因此,请根据此内容阅读下面的答案:
固定通常针对密钥而不是证书,并且可以具有多个级别。因此,您有几种选择:
1. 重复使用相同的密钥/证书生成新证书。一些人(我认为是正确的!)建议每次更新证书时生成一个新密钥,但是当您使用固定时,这很复杂。因此,固定是否鼓励了像密钥重用这样的差劲安全习惯?
2. 在您的固定策略中备有几个备用密钥,并在证书更新时轮换它们,丢弃最旧的并添加新的,以充分时间和更新来避免被抓住。个人而言,我更喜欢在证书更新时生成密钥,而不是周围备有某些可能已经被攻击的备份,因此我不是特别喜欢这种方法。而且您应该备份多少个密钥?例如,如果需要重新发布证书,因为在更新时出现了妥协并且也弄乱了呢?所以是2?3?100?
  • 将锁定更高。选择第一个中间证书或根CA证书。这样,任何新发布的证书仍然是受信任的(只要它由同一证书路径发布)。这种方法的缺点有四个:i)您仍然容易受到由该固定证书颁发的错误证书的攻击(在我看来不是很大的问题,因为您已经大大减少了攻击面,但对某些人来说仍然是一个问题),ii)您不能保证客户端将使用该中间证书,因为有时可能存在多个有效路径。这是一个更大的问题。您可能认为提供中间证书将保证其被使用,但情况并非如此(有许多SHA-1的例子)。iii)无法保证新证书将由相同的中间证书或根证书颁发(特别是当技术发生改变时,如引入SHA-2),所以对于我来说,整个选项都是不可行的。iv)它使您承诺使用相同的证书提供者(也许不是一个大问题,但我喜欢自由移动)。不确定应用程序是否本机支持此功能,但浏览器肯定支持。

  • 提前更新并在策略缓存过期之前不使用新密钥。例如,如果您有一年的证书和30天的锁定策略,则可以在11个月后进行更新,将新密钥添加到策略中,然后等待30天,以确保每个人都已经接收到新策略或者至少旧策略已经过期,然后切换密钥和证书。这取决于短暂的政策,并且可能会浪费其中的一部分时间(在此示例中至少为30天),除非证书提供商提供从旧策略过期后的第二天开始提前颁发证书。对于应用程序,如果锁定策略已经硬编码到其中,则这可能涉及推送更新所需的时间。

  • 最终,由于证书需要更新,我不是锁定技术的铁杆支持者。我认为将一个需要定期更新的东西变得半永久是错误的答案。甚至有人谈论在浏览器中预加载锁定策略,这让我感到非常不安。

    固定证书机制可确保没有伪造的证书被用于你的域名,但这种情况发生的概率实际上有多高,是否值得花时间去使用固定证书机制?类似于证书透明度或仅报告固定可能是更好的解决方案,即使它们实际上并不能阻止攻击。

    最后,本地安装的根证书(例如杀毒软件扫描器或企业代理),可以绕过浏览器上的固定检查,这会削弱其效果。

    因此,在使用固定证书机制之前,请仔细考虑,并确保您了解所有后果。


    能否请您详细说明第3-ii点?提供示例或进一步的学习链接将会非常有帮助。 - MMujtabaRoohani

    4

    似乎不再推荐使用了,也许这个答案需要更新一下? - 01F0
    HPKP已被弃用,但建议仍然有效:固定中间证书。 - gderaco

    0

    你的应用程序可以在其PIN列表中存储多个证书。更改证书的过程如下:

    • 在证书到期前一段时间,发布一个新版本的应用程序,其中包含替换证书和原始证书
    • 当旧证书到期时,在服务器上进行替换 - 应用程序应该仍然工作,因为新证书已经在PIN列表中
    • 证书到期后一段时间,发布一个新版本的应用程序,删除旧证书

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


    2
    这种方法无法支持以下几种情况:
    1. 如果有人在证书过期之前没有更新应用程序怎么办?
    2. 如果有人在服务器仍在提供旧证书的情况下安装了新应用程序,该怎么办?
    - Tahir Mehmood

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接