不是很好。
理论上,该系统应该可以工作。在实践中,它没有。旨在管理撤销的实现——即CRL和OCSP——都存在问题。此答案大部分基于Alexey Samoshkin的这篇文章以及Scott Helme的这篇文章。
CRL 呢?
证书吊销列表是确定证书是否有效的一种非常简单的方法。它本质上是所有已撤销证书的列表。如果您想检查证书是否已被吊销,您需要检查相关的吊销列表。
此列表可能非常大,下载速度很慢,并且需要您在线才能验证证书的有效性。虽然在线要求对浏览器来说似乎不是问题,但证书的用途比验证网络服务器的用途更多,网络服务器可能确实离线。
在实践中,CRL 被认为是一种过时的机制,它提供了太多的开销并且在实践中是不可行的。
OCSP 呢?
OCSP 旨在成为解决 CRL 的所有问题的金鹅。在实践中,它引入了一系列新问题。
- 由于需要向 OCSP 端点发出内联请求,延迟增加。
- OCSP 端点可用性的依赖性。
- 对 CA 的隐私妥协,因为您需要传输您希望获得 OCSP 信息的证书(以及哪些域)。
失败怎么办?
如果 CRL 或 OCSP 端点不可用会怎样?结果,什么都没有。如果证书的状态无法验证,浏览器默认认为它们是合法的。这意味着一个攻击者可以成功地让我的浏览器“放弃”尝试获取 OCSP 数据(例如,通过丢弃所有打算去 OCSP 端点的数据包),即使被撤销的证书也被认为是有效的。
我们会解决撤销问题还是应该放弃?
有一些尝试来缓解这些问题。Chrome 使用 CRLSet,Mozilla 使用 OneCRL。这个想法基本上是我的浏览器包含所有 CRL 的列表并定期(例如每天一次)更新它们。
另一个尝试是 OCSP Stapling,它将举证责任再次转移到服务器。这个想法是服务器定期询问 CA 证书是否仍然有效,然后获得一个定时响应,服务器将其包含在证书中。
这解决了上面提到的几个问题:
- 证书及其吊销状态在一次传输中发送,从而减少延迟。
- CA 不会获得有关用户请求哪些域的信息。
- CA 的 OCSP 端点可能会降低可用性,因为消息在一段时间内有效。
- OCSP 端点的负载较低,因为它更多地分布在 Web 服务器之间。
那么问题在哪里呢?
我提到证书吊销的当前状态很糟糕,所以显然必须有一个问题。事实证明,Web 服务器并不擅长实现 OCSP 装订。我不会详细介绍所有细节,因为Alexey 的文章很好地解释了它。基本要点是即使启用,某些服务器也可能不会立即发送装订响应。如果证书已被吊销,某些服务器(如 nginx)不会发送响应。这意味着即使网络服务器知道证书被吊销,它也不会告诉用户因为……原因?
怎么样must-staple
?
很高兴你问!这个想法很简单,证书包含一个标志,指示服务器必须装订 OCSP 响应,否则验证将失败。理论上听起来不错,那么问题在哪里?
问题是浏览器对这个标志的反应很奇怪。Firefox throws MOZILLA_PKIX_ERROR_REQUIRED_TLS_FEATURE_MISSING
,只有在你已经知道它的意思时才有意义——只比向我们抛出T_PAAMAYIM_NEKUDOTAYIM
. 另一方面,Chrome 根本不在乎。Chrome 根本不支持 OCSP,因此需要它的扩展被忽略是合乎逻辑的。
总之,证书吊销被破坏了,我们每个人都无法修复它。