X509證書結(jié)構(gòu)解析
X509證書是采用DER編碼的ASN1結(jié)構(gòu)數(shù)據(jù):
Certificate::=SEQUENCE{
tbsCertificate TBSCertificate,
signatureAlgorithm AlgorithmIdentifier,
signatureValue BIT STRING
}
整體X509證書是SEQUENCE類型,包括三個元素。其中,tbsCertificate是證書數(shù)據(jù)本身, TBSCertificate類型,是整個X509證書數(shù)據(jù)的主體。所謂”TBS”就是“To be signed”的縮寫,tbsCertificate的意思就是“要被簽名的證書內(nèi)容”。因為在前面的文章講過,每張證書都是被上一級證書對應(yīng)的私鑰簽過名的(頂級證書是自簽名);signatureAlgorithm就是所使用的的簽名算法標識;signatureValue就是簽名結(jié)果。
建議使用一些ASN1解析工具,打開一個證書cer文件,對照實例學(xué)習。我這里用的是Asn1Editor,打開證書文件效果如下:
下面介紹一下各個元素。第一個是tbsCertificate,TBSCertificate類型,其結(jié)構(gòu)定義如下。
TBSCertificate::=SEQUENCE{
version [0] EXPLICIT Version DEFAULT v1,
serialNumber CertificateSerialNumber,
signature AlgorithmIdentifier,
issuer Name,
validity Validity,
subject Name,
subjectPublicKeyInfo SubjectPublicKeyInfo,
issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL,
subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,
extensions [3] EXPLICIT Extensions OPTIONAL
}
TBSCertificate同樣是SEQUENCE,其各個元素說明如下:
version
證書的版本號,Version類型,其定義如下:
Version ::= INTEGER { v1(0), v2(1), v3(2) }
version的默認值是V1,但實際上現(xiàn)在使用的證書基本是V2或V3版本。由于Tag標記為[0] EXPLICIT,所以版本號如果沒有被省略,編碼時會在它外面加一個新的標識。如下圖,可見此證書的版本是V3:
serialNumber
證書的序列號,CertificateSerialNumber類型,即INTEGER類型。
CertificateSerialNumber ::= INTEGER
signature
雖然名字叫”signature”,它實際上是證書進行簽名時的算法標識,AlgorithmIdentifier類型,定義如下:
AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER,
parameters ANY DEFINED BY algorithm OPTIONAL
}
下圖可以看出,此證書的簽名算法標識是‘’1.2.156.10197.1.501”,也就是使用SM2和SM3的簽名算法。
issuer
證書頒發(fā)者信息,Name類型,相關(guān)類型定義如下:
Name ::= CHOICE {
RDNSequence }
RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
RelativeDistinguishedName ::=SET OF AttributeTypeAndValue
AttributeTypeAndValue ::= SEQUENCE {
type AttributeType,
value AttributeValue }
AttributeType ::= OBJECT IDENTIFIER
AttributeValue ::= ANY DEFINED BY AttributeType
本文中的證書頒發(fā)者包含三個信息:所在國別(countryName),頒發(fā)機構(gòu)名稱(organizationName)和通用名稱(commonName)。
validity
證書有效期,Validity類型
Validity ::= SEQUENCE {
notBefore Time, – 證書有效期起始時間
notAfter Time – 證書有效期終止時間
}
Time ::= CHOICE {
utcTime UTCTime,
generalTime GeneralizedTime }
從上圖可以看出,本文證書有效期起始和終止時間是UTCTime類型,長度5年。
subject
證書持有人(主體)信息。本文證書包含國別,所在?。╯tateOrProviceName),地址(localityName),機構(gòu)名稱和通用名稱等持有人信息。
subjectPublicKeyInfo
證書公鑰信息,SubjectPublicKeyInfo類型,定義如下:
SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier, – 公鑰算法
subjectPublicKey BIT STRING – 公鑰值
}
本證書algorithm的算法標識是ecPublicJKey,說明使用ECC算法,第二個OBJECT IDENTIFIER是參數(shù),具體說明是采用基于ECC算法的SM2算法。
issuerUniqueID
證書頒發(fā)者ID,UniqueIdentifier類型,可選。本證書里不包括。
UniqueIdentifier ::= BIT STRING
subjectUniqueID
證書持有人ID,UniqueIdentifier類型,可選。本證書里不包括。
extensions
證書擴展字段,Extensions類型,可選。
Extensions ::= SEQUENCE SIZE (1…MAX) OF Extension
Extension ::= SEQUENCE {
extnID OBJECT IDENTIFIER,
critical BOOLEAN DEFAULT FALSE,
extnValue OCTET STRING }
本文證書包含的擴展字段如下圖,具體不再一一說明。
第二個元素signatureAlgorithm值也是‘’1.2.156.10197.1.501”,說明同樣是SM2簽名。
第三個元素signatureValue是BIT STRING類型。值為對tbsCertificate的SM2簽名,而按照國密標準本身SM2簽名也是ASN1結(jié)構(gòu),所以從下圖可以看出簽名的r-s結(jié)構(gòu)。
證書的X509結(jié)構(gòu)就介紹完畢,歡迎各位指正。
————————————————
版權(quán)聲明:本文為CSDN博主「weixin_45303938」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_45303938/article/details/109138064
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。