本文根据标准文档,对x509证书的详细格式进行介绍。
1 介绍
证书的标准规范,其中使用最广泛的是由ITU(International TelecommumcationUnion,国际电信联盟)和ISO(IntemationalOrganizationforStandardization, 国际标准化组织)两个组织制定的X.509规范。
X.509是一种非常通用的证书格式。所有的证书都符合ITU-T X.509国际标准,因此(理论上)为一种应用创建的证书可以用于任何其他符合X.509标准的应用。X.509证书的结构是用ASN1(Abstract Syntax Notation One)进行描述数据结构,并使用ASN.1语法进行编码。
在一份证书中,必须证明公钥及其所有者的姓名是一致的。对X.509证书来说,认证者总是CA或由CA指定的人,一份X.509证书是一些标准字段的集合,这些字段包含有关用户或设备及其相应公钥的信息。X.509标准定义了证书中应该包含哪些信息,并描述了这些信息是如何编码的(即数据格式),具体可以参考标准原文:
RFC 5280: Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile (rfc-editor.org) 或者 RFC5280 中文翻译 中文RFC RFC文档 RFC翻译 RFC中文版 (rfc2cn.com)
1.1 证书结构
一个具体的 X.509 v3 数字证书结构如下 :
-- 由标准原文解读而来 --
Certificate ::= SEQUENCE {
tbsCertificate TBSCertificate,
signatureAlgorithm AlgorithmIdentifier,
signatureValue BIT STRING }
一个证书必须包含以上三个字段,下面分别介绍它们的含义。
1.1.1 tbsCertificate (To Be Signed Certificate) 证书
证书中待签名的部分,包含了证书的核心内容, 该字段包含主题和颁发者的名称、与主题相关联的公钥、有效期和其他相关信息。原文第 4.1.2 节详细描述了这些字段;TBSC 证书通常包括扩展,如标准原文第 4.2 节所述。TBSC 证书内容格式如下:
TBSCertificate ::= SEQUENCE {
version [0] EXPLICIT Version DEFAULT v1, // (1)版本号
serialNumber CertificateSerialNumber, // (2)序列号
signature AlgorithmIdentifier, // (3)用于签署证书的算法信息
issuer Name, // (4)颁发者名称
validity Validity, // (5)有效期
subject Name, // (6)被签名者名称
subjectPublicKeyInfo SubjectPublicKeyInfo, // (7)被签名者公钥信息
issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL, -- If present, version MUST be v2 or v3 // (8)颁发者唯一ID-可选
subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL, -- If present, version MUST be v2 or v3 // (9)被签者唯一ID-可选
extensions [3] EXPLICIT Extensions OPTIONAL -- If present, version MUST be v3 // (10)扩展信息-可选
}
-- 以下对成员结构定义解释 --
(1) version 版本号
Version ::= INTEGER {
v1(0), v2(1), v3(2) }
(2) serialNumber 序列号
CertificateSerialNumber ::= INTEGER
(3) signature 用于签署证书的算法信息 -- 定义了用于签署证书的签名算法,包括算法的标识符及其任何相关的参数,。
AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER, -- 公钥签名算法类型
parameters ANY DEFINED BY algorithm OPTIONAL } -- 可选字段,根据签名算法类型,填充算法的信息
(4) issuer name 颁发者信息
-- 颁发者字段标识已签署和颁发证书的实体。颁发者字段必须包含非空的可分辨名称 Distinguished Name(DN)。它通常由一系列属性组成,用以唯一地标识证书的发行者。DN中的属性由以下ASN.1结构定义:
Name ::= CHOICE {
rdnSequence RDNSequence } -- only one possibility for now
-RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
--RelativeDistinguishedName ::= SET SIZE (1..MAX) OF AttributeTypeAndValue -- 定义说明了`RelativeDistinguishedName`是一个由一个或多个
-- `AttributeTypeAndValue`对组成的集合,每个对代表了名称中的
-- 一个属性及其对应的值
---AttributeTypeAndValue ::= SEQUENCE {
type AttributeType,
value AttributeValue }
----AttributeType ::= OBJECT IDENTIFIER -- 指明属性类型,如国家(C)、组织(O)、通用名(CN)等。
----AttributeValue ::= ANY -- DEFINED BY AttributeType -- 属性的具体值,比如国家代码、组织名称、个人姓名等。
-----DirectoryString ::= CHOICE {
-- 定义 AttributeValue 的编码方式
teletexString TeletexString (SIZE (1..MAX)),
printableString PrintableString (SIZE (1..MAX)),
universalString UniversalString (SIZE (1..MAX)),
utf8String UTF8String (SIZE (1..MAX)),
bmpString BMPString (SIZE (1..MAX)) }
name值举例,内容通常包括以下这些信息:
1. **Common Name (CN)**: 发行者的常见名称,比如CA的名称。
2. **Organization (O)**: 发行者的组织名称。
3. **Organizational Unit (OU)**: 发行者所在组织的部门或单元名称。
4. **Country (C)**: 发行者所在的国家代码(两位字母ISO 3166国家代码)。
5. **Locality (L)**: 发行者所在的城市或区域名称。
6. **State or Province (ST or P)**: 发行者所在的州、省或行政区名称。
7. **Email**: 在某些情况下,可能会包含发行者的电子邮件地址。
subject:
relativeDistinguishedName:
sequence:
attributeTypeAndValue:
type: "2.5.4.3" // OID for Common Name (CN)
value: utf8String: "John Doe"
(5) validity 有效期
Validity ::= SEQUENCE {
notBefore Time, -- 到期时间
notAfter Time } -- 起始时间
-Time ::= CHOICE {
-- 定义了可用的时间格式
utcTime UTCTime,
generalTime GeneralizedTime }
(6) subject name 使用者信息 -- 一般和issuer name规定一致
(7) subjectPublicKeyInfo 公钥信息
SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier, -- 算法类型,可包含算法额外参数
subjectPublicKey BIT STRING } -- 使用者的公钥内容
(8) issuerUniqueID 颁发者唯一ID -- 可选的
UniqueIdentifier ::= BIT STRING
(9) subjectUniqueID 使用者唯一ID -- 可选的
(10) extensions 扩展选项 -- 可选的
Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension
Extension ::= SEQUENCE {
extnID OBJECT IDENTIFIER,
critical BOOLEAN DEFAULT FALSE,
extnValue OCTET STRING
-- contains the DER encoding of an ASN.1 value
-- corresponding to the extension type identified
-- by extnID }
1.1.2 signatureAlgorithm 签名算法
signatureAlgorithm 字段包含 CA 用于签署此证书的加密算法的标识符。[RFC 3279]、[RFC 4055]和[RFC 4491]列出了支持的签名算法,但也可能支持其他签名算法。该字段必须包含与序列 tbsCertificate(第 4.1.2.3 节)中签名字段相同的算法标识符。签名算法内容格式如下:
AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER, -- 签名算法类型
parameters ANY DEFINED BY algorithm OPTIONAL } -- 算法额外信息,可选
1.1.3 signatureValue 签名内容
根据 signatureAlgorithm 签名算法部分指定的