Certificates
為什麼 X.509 證書中的 signatureAlgorithm 欄位是多餘的?
請參閱下面的 X.509 證書的 ASN.1 描述:
Certificate ::= SEQUENCE { tbsCertificate TBSCertificate ({ x509_note_tbs_certificate }), signatureAlgorithm AlgorithmIdentifier, signature BIT STRING ({ x509_note_signature }) } TBSCertificate ::= SEQUENCE { version [ 0 ] Version DEFAULT, serialNumber CertificateSerialNumber ({ x509_note_serial }), signature AlgorithmIdentifier ({ x509_note_pkey_algo }), issuer Name ({ x509_note_issuer }), validity Validity, subject Name ({ x509_note_subject }), subjectPublicKeyInfo SubjectPublicKeyInfo, issuerUniqueID [ 1 ] IMPLICIT UniqueIdentifier OPTIONAL, subjectUniqueID [ 2 ] IMPLICIT UniqueIdentifier OPTIONAL, extensions [ 3 ] Extensions OPTIONAL }
Certificate.signatureAlgorithm 和 TBSCertificate.signature 有什麼區別?
它們似乎具有相同的值,並且 Certificate 中已經包含一個 TBSCertificate,因此其中一個值是多餘的。
那為什麼要包括在內?
來自RFC 5280 re TBSCertificate.signature
此欄位包含 CA 用於簽署證書的算法的算法標識符。
該欄位必須包含與序列證書中的 signatureAlgorithm 欄位相同的算法標識符(第 4.1.1.2 節)。
我認為是因為權威簽名在 TBSCertificate 的內容上。如果 CA 使用的簽名算法未包含在要簽名的證書中,那麼也許可以將 Certificate.signatureAlgorithm 欄位更改為更適合潛在對手的內容。
之前在security.SE上給出了類似的答案