一、参考
翻译文档:RFC5280 中文翻译 中文RFC RFC文档 RFC翻译 RFC中文版
Base64:Base64 - OpenSSLWiki
二、结构模型
end entity:PKI 证书的用户和/或作为证书主体的最终用户系统;
CA:认证机构;
RA:注册机构,即 CA 委托某些管理功能的可选系统;
CRL issuer:生成和签署 CRL 的系统;
repository:存储证书和 CRL 并用作将这些证书和 CRL 分发给终端实体的一种方式的系统或分布式系统的集合。
三、基本概念
1、证书分类
1、CA 证书
-
交叉证书:颁发者和主体是不同的实体;
-
自颁发证书:颁发者和主体是同一实体;
-
自签名证书:数字签名通过绑定到证书中的公钥进行验签;
2、终端实体证书
2、证书管理
1、注册;
2、初始化;
3、认证;
4、密钥对恢复;
5、密钥更新;
6、密钥对更新;
7、撤销请求;
8、撤销请求;
四、证书格式
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,
issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL,
-- If present, version MUST be v2 or v3
subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,
-- If present, version MUST be v2 or v3
extensions [3] EXPLICIT Extensions OPTIONAL
-- If present, version MUST be v3
}
Version ::= INTEGER { v1(0), v2(1), v3(2) }
CertificateSerialNumber ::= INTEGER
Validity ::= SEQUENCE {
notBefore Time,
notAfter Time
}
Time ::= CHOICE {
utcTime UTCTime,
generalTime GeneralizedTime
}
UniqueIdentifier ::= BIT STRING
SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
subjectPublicKey BIT STRING
}
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、Certificate 字段
证书由三个必填字段组成。
1、tbsCertificate(TBS证书)
该字段包含主题和发行者的名称、与主题相关的公钥、有效期和其他相关信息。
tbsCertificate 通常包含扩展。
2、signatureAlgorithm(签名算法)
signatureAlgorithm 字段包含 CA 用来签署此证书的加密算法的标识符。[RFC3279]、[RFC4055] 和 [RFC4491] 列出了支持的签名算法,但也可以支持其他签名算法。
算法标识符由以下 ASN.1 结构定义:
AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER,
parameters ANY DEFINED BY algorithm OPTIONAL
}
算法标识符用于标识密码算法。 OBJECT IDENTIFIER 组件标识算法(例如带有 SHA-1 的 DSA)。 可选参数字段的内容将根据识别的算法而有所不同。
该字段必须包含与序列 tbsCertificate 中的签名字段相同的算法标识符。
3、signatureValue(签名值)
signatureValue 字段包含根据 ASN.1 DER 编码的 tbsCertificate 计算的数字签名。 ASN.1 DER 编码的 tbsCertificate 用作签名函数的输入。 此签名值被编码为 BIT STRING 并包含在签名字段中。 这个过程的细节是为[RFC3279]、[RFC4055]和[RFC4491]中列出的每个算法指定的。
通过生成此签名,CA 证明 tbsCertificate 字段中信息的有效性。 特别是,CA 证明公钥材料和证书主题之间的绑定。
2、tbsCertificate(TBS证书)
TBSCertificate 序列包含与证书主题和颁发证书的 CA 相关的信息。 每个 TBSCertificate 都包含主题和颁发者的名称、与主题关联的公钥、有效期、版本号和序列号; 有些可能包含可选的唯一标识符字段。
1、Version(版本)
此字段描述编码证书的版本。 当使用扩展时,版本必须为 3(值为 2)。 如果不存在扩展,但存在 UniqueIdentifier,则版本应为 2(值为 1);如果只存在基本字段,版本应该是 1(该值作为默认值从证书中省略);
2、Serial Number(序列号)
序列号必须是 CA 分配给每个证书的正整数。 对于给定 CA 颁发的每个证书,它必须是唯一的(即,颁发者名称和序列号标识唯一证书)。 CA 必须强制 serialNumber 为非负整数。
鉴于上述唯一性要求,可以预期序列号包含长整数。 证书用户必须能够处理最多 20 个八位字节的序列号值。 符合标准的 CA 不得使用超过 20 个八位字节的 serialNumber 值。
注意:不合格的 CA 可能会颁发序列号为负数或零的证书。 证书用户应该准备好优雅地处理此类证书。
3、Signature(签名算法)
此字段包含 CA 用于签署证书的算法的算法标识符。
该字段必须包含与序列证书中的 signatureAlgorithm 字段相同的算法标识符。 可选参数字段的内容将根据识别的算法而有所不同。 [RFC3279]、[RFC4055] 和 [RFC4491] 列出了支持的签名算法,但也可以支持其他签名算法。
4、Issuer(颁发者信息)
颁发者字段标识已签署和颁发证书的实体。 issuer 字段必须包含一个非空的专有名称(DN)。 颁发者字段定义为 X.501 类型名称 [X.501]。 名称由以下 ASN.1 结构定义:
Name ::= CHOICE {
-- only one possibility for now
-- rdnSequence RDNSequence
}
RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
RelativeDistinguishedName ::= SET SIZE (1..MAX) OF AttributeTypeAndValue
AttributeTypeAndValue ::= SEQUENCE {
type AttributeType,
value AttributeValue
}
AttributeType ::= OBJECT IDENTIFIER
AttributeValue ::= ANY -- DEFINED BY AttributeType
DirectoryString ::= CHOICE {
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 描述了由属性(如国家名称)和相应的值(如 US)组成的层次名称。 组件 AttributeValue 的类型由 AttributeType 决定; 一般来说,它将是一个 DirectoryString。
DirectoryString 类型被定义为 PrintableString、TeletexString、BMPString、UTF8String 和 UniversalString 的选择。 符合此配置文件的 CA 必须使用 DirectoryString 的 PrintableString 或 UTF8String 编码,但有两个例外。 当 CA 先前已颁发具有使用 TeletexString、BMPString 或 UniversalString 编码的属性的颁发者字段的证书时,CA 可以继续使用 DirectoryString 的这些编码以保持向后兼容性。 此外,添加到现有 CA 颁发带有使用 TeletexString、BMPString 或 UniversalString 编码的属性的颁发者字段的证书的域的新 CA 可以使用与现有 CA 使用的相同编码对它们与现有 CA 共享的属性进行编码。
5、Validity(证书有效期)
证书有效期是 CA 保证将维护有关证书状态的信息的时间间隔。 该字段表示为两个日期的序列:证书有效期开始日期(notBefore)和证书有效期结束日期(notAfter)。 notBefore 和 notAfter 都可以编码为 UTCTime 或 GeneralizedTime。
6、Subject(主题)
主题字段标识与存储在主题公钥字段中的公钥相关联的实体。主题名称可以在主题字段和/或 subjectAltName 扩展中携带。如果主题是 CA(例如,存在基本约束扩展,并且 CA 的值为 TRUE),则主题字段必须填充与内容匹配的非空专有名称主题 CA 颁发的所有证书中的颁发者字段。如果主题是 CRL 颁发者(例如,存在密钥使用扩展,并且 cRLSign 的值为 TRUE),则主题字段必须填充与匹配的非空专有名称主题 CRL 发行者发行的所有 CRL 中发行者字段的内容。如果主题命名信息仅存在于 subjectAltName 扩展中(例如,仅绑定到电子邮件地址或 URI 的键),则主题名称必须是空序列,并且 subjectAltName 扩展必须是关键的。
如果它是非空的,主题字段必须包含一个 X.500 专有名称 (DN)。 对于由一个 CA 认证的每个主题实体,DN 必须是唯一的,该 CA 由颁发者字段定义。 一个 CA 可以向同一个主题实体颁发多个具有相同 DN 的证书。
主题字段定义为 X.501 类型名称。该字段的实现要求是为颁发者字段定义的。本规范的实现必须准备好接收包含颁发者字段所需的属性类型的主题名称。本规范的实现应该准备好接收包含颁发者字段的推荐属性类型的主题名称。这些属性类型的语法和相关对象标识符(OID)在附录 A 的 ASN.1 模块中提供。本规范的实现可以使用第 7.1 节中的比较规则来处理不熟悉的属性类型(即,用于名称链接),其属性值使用 DirectoryString 中的一种编码选项。当不熟悉的属性类型包括具有与 DirectoryString 中的编码选项不同的编码选项的属性值时,应使用二进制比较。这允许实现处理主题名称中具有不熟悉属性的证书。
7、Subject Public Key Info(公钥信息)
该字段用于携带公钥并标识使用该密钥的算法(例如,RSA、DSA 或 Diffie-Hellman)。 该算法使用第 4.1.1.2 节中指定的 AlgorithmIdentifier 结构来标识。 [RFC3279]、[RFC4055]和[RFC4491]中规定了支持算法的对象标识符和对公钥材料(公钥和参数)进行编码的方法。
8、Unique Identifiers(唯一标识符)
这些字段必须仅在版本为 2 或 3 时出现。 如果版本为 1,则不得出现这些字段。证书中存在主题和颁发者唯一标识符,以处理随着时间的推移重复使用主题和/或颁发者名称的可能性。 此配置文件建议不要为不同的实体重用名称,并且 Internet 证书不使用唯一标识符。 符合此配置文件的 CA 不得生成具有唯一标识符的证书。 符合此配置文件的应用程序应该能够解析包含唯一标识符的证书,但没有与唯一标识符相关的处理要求。
9、Extensions(扩展)
此字段必须仅在版本为 3 时出现。 如果存在,该字段是一个或多个证书扩展的序列。 Internet PKI 中证书扩展的格式和内容在第 4.2 节中定义。
3、证书扩展
为 X.509 v3 证书定义的扩展提供了将附加属性与用户或公钥相关联以及管理 CA 之间关系的方法。 X.509 v3 证书格式还允许社区定义私有扩展来携带这些社区独有的信息。证书中的每个扩展都被指定为关键或非关键。如果使用证书的系统遇到它无法识别的关键扩展或包含它无法处理的信息的关键扩展,则必须拒绝证书。一个非关键扩展如果不被识别可以被忽略,但如果它被识别则必须被处理。以下部分介绍了在 Internet 证书和标准位置中使用的推荐扩展信息以供参考。社区可以选择使用额外的扩展;但是,在证书中采用任何可能阻止在一般情况下使用的关键扩展时,应谨慎行事。
每个扩展都包含一个 OID 和一个 ASN.1 结构。 当证书中出现扩展时,OID 显示为字段 extnID,相应的 ASN.1 DER 编码结构是八位字节字符串 extnValue 的值。 证书不得包含多个特定扩展的实例。 例如,一个证书可能只包含一个授权密钥标识符扩展。 扩展包括布尔关键值,默认值为 FALSE。 每个扩展的文本指定符合此配置文件的 CA 的关键字段的可接受值。
符合标准的 CA 必须支持密钥标识符、基本约束、密钥使用和证书策略扩展。 如果 CA 颁发的证书的主题字段序列为空,则 CA 必须支持主题替代名称扩展。 对剩余扩展的支持是可选的。 符合标准的 CA 可以支持本规范中未标识的扩展; 证书颁发者应注意,将此类扩展标记为关键可能会抑制互操作性。
此外,符合此配置文件的应用程序应该识别权限和主题密钥标识符和策略映射扩展。
特别说明:其他内容未进行整理
五、证书示例
1、准备证书
nfs@nfs-Vostro-3881:/openssl-test$ ls -l
总用量 16
-rwxrwxrwx 1 root root 1253 7月 15 18:14 ca.cer
-rwxrwxrwx 1 root root 1029 7月 15 18:13 ca.csr
-rwxrwxrwx 1 root root 1679 7月 15 18:13 ca.key
-rwxrwxrwx 1 root root 1766 7月 15 18:12 ca.pass.key
nfs@nfs-Vostro-3881:/openssl-test$
nfs@nfs-Vostro-3881:/openssl-test$
nfs@nfs-Vostro-3881:/openssl-test$ cat ca.cer
-----BEGIN CERTIFICATE-----
MIIDcDCCAlgCCQCGPYOxtTcJEjANBgkqhkiG9w0BAQsFADB5MQswCQYDVQQGEwJD
TjELMAkGA1UECAwCU0QxCzAJBgNVBAcMAkpOMQ0wCwYDVQQKDARRRFpZMRUwEwYD
VQQLDAx3d3cudGVzdC5jb20xCzAJBgNVBAMMAkNBMR0wGwYJKoZIhvcNAQkBFg5h
ZG1pbkB0ZXN0LmNvbTAgFw0yMjA3MTUxMDE0MjBaGA8yMTIyMDYyMTEwMTQyMFow
eTELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAlNEMQswCQYDVQQHDAJKTjENMAsGA1UE
CgwEUURaWTEVMBMGA1UECwwMd3d3LnRlc3QuY29tMQswCQYDVQQDDAJDQTEdMBsG
CSqGSIb3DQEJARYOYWRtaW5AdGVzdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IB
DwAwggEKAoIBAQDHong+7hE6NFuZXO/kdPq1x/FckQ9fC2dWVVbUb79cLQrG2/4c
Rf5VBHEGo2pqkQAjuKEgjWbxzFXSi5FXHrSFjozWvpE8HFnH2g3UTKlbfxG2xZKl
apKzPf9z/nX4YeQM/EfUFJuWi/SgqAti9iulBrhu0X7dPa84+Fsna4ssj0Xs+G+B
OTi6wmHX8T/BMDbPmPHqRraYLbiXtvX0RyQRiYO2x2CtzvmVquWULPiFci4qkyHi
4+G2zOUs9/gQZ7EO0kEUG3cnqZ42dAjFbWq1EHBfq7tX7sgd34KyHpc8elW3R95v
EhNLPDF4RyJtawpeFYr7g46dCbtbIKgV4RePAgMBAAEwDQYJKoZIhvcNAQELBQAD
ggEBACSV79J2Gt7I3H//lARkINubSqcm9zri/b9kGaCWy2uvCOhxUsLWaWOTwFW2
V8XBLBCEhkg+CYmwF4UofMTvWbzkRT2SK1TrXJN6SQYWSBq+eNPgg2EID+ROy+Qn
OdePGt/W60OfLF7RtPq3IoKFi3KlvG1DhpkiPauNbzYAV7C13s5bmwA+BeSIIEQV
PMndY7kU7wofa6imwNdsmHmKLebCuiyWUk6VXxn1GPvSOrneftRHpMRfyuHq34Lm
XGZYur+dY6R1EF1YJdfU155rCSlMWxcgT92fJylyEOGhpuz6kM4BPA+roaMEPamb
WWfl0oFIOO68WqgX7yzHAQtMMUo=
-----END CERTIFICATE-----
nfs@nfs-Vostro-3881:/openssl-test$
2、查看证书内容
openssl x509 -in ca.cer -noout -text
nfs@nfs-Vostro-3881:/openssl-test$ ls -l
总用量 16
-rwxrwxrwx 1 root root 1253 7月 15 18:14 ca.cer
-rwxrwxrwx 1 root root 1029 7月 15 18:13 ca.csr
-rwxrwxrwx 1 root root 1679 7月 15 18:13 ca.key
-rwxrwxrwx 1 root root 1766 7月 15 18:12 ca.pass.key
nfs@nfs-Vostro-3881:/openssl-test$
nfs@nfs-Vostro-3881:/openssl-test$ openssl x509 -in ca.cer -noout -text
Certificate:
Data:
Version: 1 (0x0)
Serial Number:
86:3d:83:b1:b5:37:09:12
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = CN, ST = SD, L = JN, O = QDZY, OU = www.test.com, CN = CA, emailAddress = admin@test.com
Validity
Not Before: Jul 15 10:14:20 2022 GMT
Not After : Jun 21 10:14:20 2122 GMT
Subject: C = CN, ST = SD, L = JN, O = QDZY, OU = www.test.com, CN = CA, emailAddress = admin@test.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:c7:a2:78:3e:ee:11:3a:34:5b:99:5c:ef:e4:74:
fa:b5:c7:f1:5c:91:0f:5f:0b:67:56:55:56:d4:6f:
bf:5c:2d:0a:c6:db:fe:1c:45:fe:55:04:71:06:a3:
6a:6a:91:00:23:b8:a1:20:8d:66:f1:cc:55:d2:8b:
91:57:1e:b4:85:8e:8c:d6:be:91:3c:1c:59:c7:da:
0d:d4:4c:a9:5b:7f:11:b6:c5:92:a5:6a:92:b3:3d:
ff:73:fe:75:f8:61:e4:0c:fc:47:d4:14:9b:96:8b:
f4:a0:a8:0b:62:f6:2b:a5:06:b8:6e:d1:7e:dd:3d:
af:38:f8:5b:27:6b:8b:2c:8f:45:ec:f8:6f:81:39:
38:ba:c2:61:d7:f1:3f:c1:30:36:cf:98:f1:ea:46:
b6:98:2d:b8:97:b6:f5:f4:47:24:11:89:83:b6:c7:
60:ad:ce:f9:95:aa:e5:94:2c:f8:85:72:2e:2a:93:
21:e2:e3:e1:b6:cc:e5:2c:f7:f8:10:67:b1:0e:d2:
41:14:1b:77:27:a9:9e:36:74:08:c5:6d:6a:b5:10:
70:5f:ab:bb:57:ee:c8:1d:df:82:b2:1e:97:3c:7a:
55:b7:47:de:6f:12:13:4b:3c:31:78:47:22:6d:6b:
0a:5e:15:8a:fb:83:8e:9d:09:bb:5b:20:a8:15:e1:
17:8f
Exponent: 65537 (0x10001)
Signature Algorithm: sha256WithRSAEncryption
24:95:ef:d2:76:1a:de:c8:dc:7f:ff:94:04:64:20:db:9b:4a:
a7:26:f7:3a:e2:fd:bf:64:19:a0:96:cb:6b:af:08:e8:71:52:
c2:d6:69:63:93:c0:55:b6:57:c5:c1:2c:10:84:86:48:3e:09:
89:b0:17:85:28:7c:c4:ef:59:bc:e4:45:3d:92:2b:54:eb:5c:
93:7a:49:06:16:48:1a:be:78:d3:e0:83:61:08:0f:e4:4e:cb:
e4:27:39:d7:8f:1a:df:d6:eb:43:9f:2c:5e:d1:b4:fa:b7:22:
82:85:8b:72:a5:bc:6d:43:86:99:22:3d:ab:8d:6f:36:00:57:
b0:b5:de:ce:5b:9b:00:3e:05:e4:88:20:44:15:3c:c9:dd:63:
b9:14:ef:0a:1f:6b:a8:a6:c0:d7:6c:98:79:8a:2d:e6:c2:ba:
2c:96:52:4e:95:5f:19:f5:18:fb:d2:3a:b9:de:7e:d4:47:a4:
c4:5f:ca:e1:ea:df:82:e6:5c:66:58:ba:bf:9d:63:a4:75:10:
5d:58:25:d7:d4:d7:9e:6b:09:29:4c:5b:17:20:4f:dd:9f:27:
29:72:10:e1:a1:a6:ec:fa:90:ce:01:3c:0f:ab:a1:a3:04:3d:
a9:9b:59:67:e5:d2:81:48:38:ee:bc:5a:a8:17:ef:2c:c7:01:
0b:4c:31:4a
nfs@nfs-Vostro-3881:/openssl-test$