RFC 5280 的第 4.1 节定义了 x509 证书的内容。具体来说,列出了两个字段(signatureAlgorithm
和signature
)并定义为包含相同的信息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 节)。
我的问题是:为什么同一条信息必须列出两次?
我可以理解希望在证书数据部分包含哈希算法和签名生成方法,以便它包含在签名验证中,因此不易受到更改的影响。
但如果是这种情况,为什么还要在证书数据和签名部分之间再次列出呢?