CRL over HTTPS:这真的是一种不好的做法吗?

信息安全 tls 公钥基础设施 x.509 crl
2021-08-26 23:40:31

在 Internet 上,我可以找到多年来所做的一些 声明,声称通过 HTTPS 提供 X.509 CRL 是一种不好的做法,因为要么

  1. 在检查 TLS 证书和
  2. 考虑到 CRL 根据定义是由 CA 签署的,并且是非机密工件,这只是一种资源浪费。

然而:

  1. 推荐的替代方案是 OCSP(可能与各种类型的装订结合使用)。然而,OSCP 响应也由一个可撤销的实体签名,其状态也需要检查,所以我不明白这如何解决鸡与蛋的问题。也许,如果我们假设 PKI 设计考虑到避免状态检查的循环依赖的需要,那么实际上不存在任何先有鸡还是先有蛋的问题。

  2. CRL 已签名,但在 CRL 本身的有效期内仍不提供重放保护。换句话说,您无法在 CRL 的有效期结束之前可靠地对其发出紧急更新,因为强大的攻击者实际上可以操纵所有传出的普通 HTTP 请求,并在该期间用旧的紧急 CRL 替换新的紧急 CRL。HTTPS 至少会在一定程度上防止这种情况发生。

我还读到某些实现只是拒绝通过 HTTPS ( Microsoft ) 检索 CRL:这可能是避免它的一个务实的好理由。然而,这样一来,我们也在延续一种有问题的做法。

我在哪里弄错了吗?
是时候重新审视对通过 HTTPS 分发 CRL 的偏见了吗?考虑到仅 HTTPS 的强大趋势正在持续,预测在某些环境中仅 HTTP 请求可能会在网络级别被阻止并非不合理。

4个回答

我通常同意 Steffen Ulrich 的观点,我只想加几分钱,因为 OP 引用了我自己认为正确且有效的答案。

然而,OSCP 响应也由可撤销实体签署

它不是一个可撤销的实体。OCSP 签名证书包括id-pkix-ocsp-nocheck证书扩展,指示客户端不要检查此特定证书以进行吊销。通常,OCSP 签名证书不包括证书中的 CDP(CRL 分发点)或 AIA(OCSP 访问方法)扩展。这个技巧消除了 OCSP 签名证书的鸡蛋和鸡肉问题。

CRL 已签名,但在 CRL 本身的有效期内仍不提供重放保护。

这是正确的。但是这个问题在当前的 X.509 配置文件中没有得到解决。无法提供立即撤销响应(即立即检测特定证书是否被撤销)。吊销基础设施严重依赖缓存,甚至装订的 OCSP 响应可能不是最新的,可能有更新的响应,但服务器尚未获得它并使用缓存的 OCSP 响应来装订 TLS。正如 Steffen 所说,改善这种体验的唯一方法是使用短期 CRL/OCSP 响应并使用支持 CDP 轮询的客户端来检测是否存在比存储在客户端本地缓存中的 CRL 更新的 CRL。

我还读到某些实现只是拒绝通过 HTTPS 检索 CRL

Microsoft CryptoAPI 在 CDP 扩展方面的行为正是如此。它甚至不会尝试使用 HTTPS 方案连接到 URL。如果服务器请求 TLS 协商,它将使 URL 失败。不了解其他加密框架,因此该声明可能不适用于其他工具。

作为底线:我仍然看不到通过 HTTPS 实施 CDP 的有用理由。CRL 是可公开分发的内容——没有理由保护内容隐私。它是数字签名的——没有额外签名的理由。MiTM 可以通过纯 HTTP 修改 CRL 内容以故意使 CRL 签名无效的事实并没有被 TLS 缓解。MiTM 可以任意篡改 TLS 流量,强制客户端拒绝被篡改的数据。两种情况下的效果相同:拒绝服务和 TLS 不能解决这个问题。

什么是合理的——通过网络(例如您的 ISP)向男性隐藏您的活动历史,但仍然值得怀疑。

...鸡和蛋的问题...

没有真正的先有鸡还是先有蛋的问题。吊销(无论是 CRL 还是 OCSP 或其他)只是证书验证的一部分,并且执行 95%(即 HTTPS w/o 吊销检查)仍然比执行 0%(纯 HTTP)更好。

...不提供重播保护...在 CRL 有效期结束之前,您无法可靠地向 CRL 发出紧急更新...

虽然 HTTPS 有助于防止攻击者重放旧 CRL,但它不能确保新 CRL 实际到达客户端。攻击者仍然可以简单地拒绝连接,并且从客户端的角度来看这很好,因为旧的 CRL 仍然有效。因此,HTTPS 也不是允许紧急更新 CRL 的方法。除此之外,如果当前 CRL 仍然有效,客户端甚至可能不会检查更新。这里正确的机制是使用更短的过期时间。

注意:请参阅Crypt32 的优秀答案以获得更深入的解释和更多技术细节。

TLS/HTTPS 客户端通常会缓存 OCSP/CRL 请求的结果。当客户端向 CA 发送请求并建立 HTTPS 连接时,大部分时间它使用缓存的证书验证结果。这就是为什么没有递归发生,没有鸡蛋问题。当然,客户端应考虑缓存结果不可用或过期的情况,并应防止递归。在这种情况下,客户端使用基于未经验证的证书的 HTTPS 连接。但这与普通的 HTTP 连接具有绝对相同的安全性,只有在这种情况下,HTTPS 与 HTTP 相比没有优势。

如果您将 HTTP 用于 OCSP/CRL,那么任何可以读取您的流量的方(互联网提供商、途中的任何代理服务器)都可以查看请求的证书、时间、顺序,从而可以深入了解您的浏览历史. 如果您使用 HTTPS,那么只有 CA 知道您请求了哪些证书。因此,使用 HTTPS 确实有意义。

TLDR:

  1. 微软网站上的幼稚答案是不正确的。处理递归是微不足道的。RFC 2580记住要记住这一点:依赖方......必须为这将导致无限递归的可能性做好准备
  2. 由于缓存了 OCSP/CRL 结果并且处理递归是微不足道的,所以鸡蛋场景不会导致任何真正的问题。
  3. 使用 HTTPS 确实有意义,因为它隐藏了您的浏览历史记录。

我也同意 Steffen Ulrich 的观点,但我可以从微软的角度来看。不,我不为微软工作,也没有问过他们的任何员工。

假设攻击者可以是 MitM。可能的攻击?

  • 通过 HTTP:攻击者可以重放旧的 CRL,让受害者认为证书仍然有效。受害者不会注意到差异并接受撤销的证书
  • 通过 HTTPS:攻击者可以拒绝连接,但客户端可以意识到(并怀疑)这一点,但此时攻击者不一定提供有效的旧 CLR
  • 通过 HTTPS:当且仅当攻击者拥有pwnedTLS 密钥时,他们才能设置一个以旧 CLR 响应的中间人。并再次陷入http案例

因此,从我的角度来看,https 有助于使攻击更加复杂。不仅当密钥被其他人积极使用时,证书才会被吊销。