为什么签名算法在 x509 证书中列出两次?

信息安全 x.509
2021-08-28 06:18:50

RFC 5280 的第 4.1 节定义了 x509 证书的内容。具体来说,列出了两个字段(signatureAlgorithmsignature)并定义为包含相同的信息AlgorithmIdentifier

4.1.  Basic Certificate Fields
  The X.509 v3 certificate basic syntax is as follows.
  Certificate  ::=  SEQUENCE  {
        tbsCertificate       TBSCertificate,
        signatureAlgorithm   AlgorithmIdentifier,            <------
        signatureValue       BIT STRING  }
  TBSCertificate  ::=  SEQUENCE  {
        version         [0]  EXPLICIT Version DEFAULT v1,
        serialNumber         CertificateSerialNumber,
        signature            AlgorithmIdentifier,            <------
        issuer               Name,
        validity             Validity,
        subject              Name,
        subjectPublicKeyInfo SubjectPublicKeyInfo,
     <-~- truncated -~->

后来,在第 4.1.1.2 节中,signatureAlgorithm定义为:

4.1.1.2。签名算法

signatureAlgorithm 字段包含 CA 用于签署此证书的加密算法的标识符。...该字段必须包含与序列 tbsCertificate(第 4.1.2.3 节)中的签名字段相同的算法标识符。

第 4.1.2.3 节中,signature定义为:

4.1.2.3。签名

此字段包含 CA 用于签署证书的算法的算法标识符。

该字段必须包含与序列证书中的 SignatureAlgorithm 字段相同的算法标识符(第 4.1.1.2 节)。

我的问题是:为什么同一条信息必须列出两次?

我可以理解希望在证书数据部分包含哈希算法和签名生成方法,以便它包含在签名验证中,因此不易受到更改的影响。

但如果是这种情况,为什么还要在证书数据和签名部分之间再次列出呢?

我遇到了其他似乎问同样 问题的问题,但我没有找到专门说明为什么它被列出两次的答案。只是它必须列出两次。

1个回答

我认为这是对某种称为“算法替换攻击”的加密攻击的保护。

请看这里:加密消息语法(CMS)算法标识符保护属性(RFC6211)

此处简要说明:https ://www.rfc-editor.org/rfc/rfc6211

在 X.509 证书中,签名算法受到保护,因为它在 TBSCertificate.signature 字段中重复,但前提是验证器将比较这两个字段作为签名验证过程的一部分。

我认为这正是您正在寻找的:)

干杯!

编辑:编辑添加“我认为”。

编辑2:发现问题是重复的......来自这篇文章:https ://security.stackexchange.com/a/24796 与“TBSCertificate.signature”字段相关:

这个字段似乎没有太多用处,尽管您应该检查算法标识符是否与证书上的签名匹配(如果有人可以伪造证书上的签名,那么他们也可以更改内部算法标识符,这可能是由于一些模糊的攻击而被包括在内的,在这种攻击中,可以说服(破坏)签名算法 A 产生与(安全)算法 B 相同的签名值的人可以将外部不受保护的算法标识符从 B 更改为 A,但不能t 在不使签名无效的情况下更改内部标识符。这将实现什么尚不清楚)。