当 ssl 证书过期并且您的应用程序使用 ssl pinning 时,您会怎么做?

信息安全 tls 证书 证书颁发机构
2021-09-01 19:17:33

我最初在 StackOverflow 上发布了这个问题,但由于缺乏回复而在此处重新发布。


我正在尝试确定在使用服务器传递内容的 iOS 游戏中进行 ssl 固定是否是个好主意。这似乎很重要,但真正困扰我的一件事是想到证书到期的那一天。由于证书必须包含在应用程序包中,这意味着用户将被迫升级。根据苹果当时的做法,可能意味着他们由于设备/操作系统限制而无法升级。所以,我真的很紧张把这个放进去。

有没有人有过 ssl pinning 和过期证书的经验,使这对您的用户来说是无缝的、无停机的事情?

3个回答

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

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

这应该会降低服务中断的风险,但不会完全消除它,因为某些用户可能不会安装您的应用程序的新版本。

此外,在您需要快速更改服务器证书的情况下(例如,您认为证书可能已被泄露),它可能对您没有帮助。

我还听说有人允许他们的应用程序在通过“更受信任的”网络连接时更新他们的 pin 列表。例如,WiFi 不如 3G/4G 可信,因为它必须更便宜且更容易对 WiFi 进行中间人攻击。

总的来说,从操作的角度来看,我认为证书固定导致的问题多于它解决的问题,除非您的数据特别敏感并且机密性/完整性显着超过了您关注的列表中的可用性。(我意识到我可能会对此观点投反对票)。

您使用中间签名密钥签署新证书。
具体来说,“包含在应用程序包中”的是您的根签名验证密钥

我需要假设您正在描述https://developer.mozilla.org/en/docs/Web/Security/Public_Key_Pinning中记录的公钥固定(HPKP)(这些天与 TLS 相关的活动进展非常迅速,所以也许有其他一些 SSL pinning 正在试验)。

如 Ricky 的回答中所述,您可以固定中间(甚至根)证书的公钥,和/或您也可以固定“下一个”CA 的密钥。(例如,您可以固定当前 CA,以及letsencrypt 中间CA)。这样做的危险显然是无法保证他们下一个颁发的证书将使用该特定密钥!在固定任何其他密钥时,您相信它不会将您的域的证书颁发给其他人 - 风险只能由您来衡量。(有些被 CA 在更新前切换到新密钥所困扰)。

还有另一种选择,因为 pin 实际上是关于公钥的,如果您使用相同的公钥重新颁发证书,那么新证书将具有相同的 pin 哈希。同样,您可以使用已生成但尚未发送到任何 CA 的新 CSR 准备新 pin。