如何确定 CT 日志中的证书是否是我自己的?

信息安全 证书透明度
2021-08-14 01:03:19

我正在尝试扫描我的域的证书透明度日志,并且我想过滤掉合法颁发的证书的日志条目,这样我只会在其他获得我的域的证书时收到警报。

我试图通过将 CT 日志条目的指纹与我服务器上证书的指纹进行比较来确定 CT 日志条目是否是我的。然而,我发现日志中的一些条目是“预证书”,它们有一个额外的关键扩展,使它们在浏览器中无效。出于透明目的,这些显然被认为等同于最终颁发的证书(因此忽略所有预证书似乎是个坏主意),但它们的指纹与我拥有的密钥不匹配。

我如何确定这样的预证书等同于已颁发的证书?

2个回答

检查公钥,如果匹配,就OK了。归根结底,密钥是证书的重要部分,就好像它是你的密钥,攻击者因此没有相应的私钥,其余的都不重要。

不要按照建议检查证书ID,ID可以被操纵。

是的,最简单的方法是只比较预证书和证书中的公钥,如上所述。但是,如果 CA 颁发的证书具有不正确的预证书数据,则方法可能是错误的。让我解释。假设您有未来可能的证书的 TBS (ToBeSigned) 部分。然后CA从TBS制作预证书(附加“毒物扩展”并用一种假密钥签署预证书)并将其发送到CT日志。然后 CA 收到证书的 SignedCertificateTimestamp (SCT),并将 SCT 作为扩展包含在初始 TBS 中。然后 CA 颁发真实证书 - 使用真实 CA 密钥签署 TBS。但是可能存在一个问题:一些 CA 可能会通过使最终 TBS 与预证书中的不同,从而错误地颁发最终用户证书!这是一个真实的例子

通常颁发的所有预证书都是为了对 SignedCertificateTimestampList (1.3.6.1.4.1.11129.2.4.2) X.509 证书扩展具有价值。但实际上在证书扩展中,你只会发现 TBS (ToBeSigned) 部分的预证书,而不是完整的预证书。为了证明这个特定的预证书是针对这个特定的证书的,您需要根据从证书中扣除的 PreCert 类型来验证 SignedCertificateTimestampList 扩展的值。听起来很复杂,但这就是一切的运作方式。为了帮助大家解决CT内部数据校验的问题,我做了CTjs lib。在这里,您可以找到如何根据最终用户证书正确验证预证书数据的示例。

随时询问有关 CT 数据的任何其他问题。