文章目录
- [0 前言](#0 前言)
- [1 x509 是什么](#1 x509 是什么)
- [2. rfc5280 定义](#2. rfc5280 定义)
-
- [2.2 证书结构](#2.2 证书结构)
- [2.2.1 整体结构](#2.2.1 整体结构)
- [2.2.2 tbsCertificate](#2.2.2 tbsCertificate)
- [2.2.3 signatureAlgorithm](#2.2.3 signatureAlgorithm)
- [2.2.4 signatureValue](#2.2.4 signatureValue)
- 3.x509证书生成及解析
-
- [3.1 证书生成](#3.1 证书生成)
-
- [3.1.1 生成 Root CA](#3.1.1 生成 Root CA)
-
- [3.1.1.1 生成root私钥](#3.1.1.1 生成root私钥)
- [3.1.1.2 生成root证书](#3.1.1.2 生成root证书)
- [3.1.2 生成CSR](#3.1.2 生成CSR)
- [3.1.3 CA 对 CSR 进行签名](#3.1.3 CA 对 CSR 进行签名)
- [3.2 证书结构分析](#3.2 证书结构分析)
-
- [3.2.1 读取内容](#3.2.1 读取内容)
- [3.2.3 openssl 解析内容](#3.2.3 openssl 解析内容)
- [3.2.4 使用ASN.1查看](#3.2.4 使用ASN.1查看)
0 前言
引子
当ECU访问云端服务器时,实现TLS时,会使用到证书;
安全启动中,某些芯片的方案是基于证书的方案;
在 DDS Security 中,同样离不开 X.509 证书。
然而,很多开发者虽然经常使用证书,却对证书本身了解并不深入。
例如:
- X.509 到底是什么?
- 它是一种证书还是一种标准?
- 为什么一个证书中会出现两个 Signature Algorithm 字段?
- TBSCertificate 为什么叫 To Be Signed Certificate?
- CA 实际签名的是整个证书,还是其中的一部分?
带着这些问题,本文将以 RFC 5280 为主线,结合 OpenSSL 实验,从 X.509 的标准定义、证书生成流程、ASN.1 数据结构以及证书解析 四个方面展开介绍,帮助读者理解一张 X.509 证书究竟包含哪些内容,以及它是如何被生成和验证的。
学习地图
我们将以系列文章去带领大家了解PKI。本章节在PKI体系的中的位置如图所示。

1 x509 是什么
一句话理解:X.509 是一种数字证书标准,它规定了数字证书应该包含哪些内容、采用什么数据结构以及如何建立证书信任体系。

X.509 是由 ITU-T(国际电信联盟电信标准化部门)制定的标准,最初属于 X.500 目录服务(Directory Services) 系列标准。
它最初用于目录服务,但后来成为互联网 PKI(Public Key Infrastructure)的事实标准。
今天几乎所有的数字证书都遵循 X.509,例如:
- HTTPS/TLS 网站证书
- Root CA(根证书)
- Intermediate CA(中间 CA)
- 代码签名证书
- S/MIME 邮件证书
- VPN 证书
- DDS Security 使用的身份证书
2. rfc5280 定义
2.2 证书结构
2.2.1 整体结构
- 证书整体上分为三部分
-
tbsCertificate:to Be Signed Certificate 待签名的证书
-
signatureAlgorithm 签名算法
-
signatureValue 签名值

Certificate ::= SEQUENCE {
tbsCertificate TBSCertificate,
signatureAlgorithm AlgorithmIdentifier,
signatureValue BIT STRING }
-
2.2.2 tbsCertificate
一句话理解TBS ,TBSCertificate 就是证书中最核心的数据部分,承载了"谁发的、发给谁、用什么公钥、有效多久"等所有关键信息,然后再由 CA 对这部分数据进行签名,最终形成完整的证书
-
该字段包含主体(subject)和颁发者(issuer)的名称、与主体关联的公钥、有效期以及其他相关信息。tbsCertificate 通常还包含扩展项。
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 }
2.2.3 signatureAlgorithm
-
签名算法标识
AlgorithmIdentifier ::= SEQUENCE { algorithm OBJECT IDENTIFIER, parameters ANY DEFINED BY algorithm OPTIONAL }
2.2.4 signatureValue
tbsCertificate的签名值
3.x509证书生成及解析
3.1 证书生成
3.1.1 生成 Root CA
3.1.1.1 生成root私钥
openssl genpkey \
-algorithm RSA \
-out ca.key \
-pkeyopt rsa_keygen_bits:4096
3.1.1.2 生成root证书
openssl req \
-new \
-x509 \
-key ca.key \
-days 3650 \
-out ca.crt

3.1.2 生成CSR
- CSR生成过程,已经在《Public Key Infrastructure(一)---CSR 到底是什么?带你拆解证书申请全过程》做过介绍,如果需求,请自行阅读

3.1.3 CA 对 CSR 进行签名
openssl x509 \
-req \
-in request.csr \
-CA ca.crt \
-CAkey ca.key \
-CAcreateserial \
-out certificate.crt \
-days 365 \
-sha256
| 参数 | 说明 |
|---|---|
-req |
输入的是 CSR |
-CA |
CA 证书 |
-CAkey |
CA 私钥 |
-CAcreateserial |
自动生成序列号文件 |
-days |
证书有效期 |
-sha256 |
使用 SHA-256 签名 |

3.2 证书结构分析
3.2.1 读取内容
cat certificate.crt
-----BEGIN CERTIFICATE-----
MIIEYDCCAkgCFCqZfxj2+K5vku8QFr3GzWZYuy/tMA0GCSqGSIb3DQEBCwUAMFgx
CzAJBgNVBAYTAkNOMQswCQYDVQQIDAJaSjELMAkGA1UEBwwCSFoxEDAOBgNVBAoM
B3Jvb3RfQ0ExDjAMBgNVBAsMBXRlc3QxMQ0wCwYDVQQDDARyb290MB4XDTI2MDcy
ODIyNDcxMFoXDTI3MDcyODIyNDcxMFowgYAxCzAJBgNVBAYTAkNOMREwDwYDVQQI
DAh6aGVqaWFuZzERMA8GA1UEBwwIaGFuZ3pob3UxEjAQBgNVBAoMCXRlc3RfdGVj
aDENMAsGA1UECwwEdGVjaDEUMBIGA1UEAwwLbWFuYnVzaHVoYWkxEjAQBgkqhkiG
9w0BCQEWA3h4eDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPNM+17W
/Ym6xxRzXtyVD0aXIBfvts0jCsl6VNipVhr0j9GU/X9pIQOPvbYs0/S/DHFm76QS
SPUPYs3i7WVD6DSgRIpoYLE8MK1hJORtcSyy2EKStByYyMrkDNBxxCDt2qdbyW/F
Isrw4+4h6geVOiP4Mit4Y2dDHzt8dkuQzNMC+lm+n3XD4FsKdlUbQ9NoO+PYd3b1
DHvjTf7FOdmYceMg56g9SOUFGOWuMaTh2+LHxedIv0wNcrsLowOs8zlltT9F1nwN
ETuAVAN6+6y3caO/ydNL+uaSI8Ug5VY+ymRBDe7DhYyjQUmmQEOCpn15tP+lsyFy
wxa/Fbl967rN3b8CAwEAATANBgkqhkiG9w0BAQsFAAOCAgEACE0MwTHc4XLWeJKL
WBq9L/q6Y2aBw10eZvKczDQbaydKe9cXcqLQPPrV1eI9EJsx+C/spiTcL94hfTLW
wDcrChcEQ9GvcdVLpM4ke33YQb6o2OqBgi6la6alaKfISj9V9ui7zBo/5rrORI7Q
fHFrA16DvZRWS8O8lWbNgpwS/cYqU3UGhRjPckUWPkAXCtWqMu00wbwKbguSpiMW
F+DnBElyq4UOdEzpORM3UxQ6VhDBtdi1LgEQPAMZkimTauZVyw3acahVwRAnI/f5
UKR3XTvAzq2aELsNLs9h/AyfL2g3Yd4zzFUOV0xYpHcX17egAsoOk4KPwOUb4J4b
hC5vWL0o78arGBdiYTjAc3al3UqXH8e4FNkEDNmmxusyonCc3YWJ40noCuRihfAO
pNZDcwlx8UbChD65SkRGnTa/rogk7bnFgBkhTe6aEx9rzb0pitdeE7lqCc3YHphM
3qv+5v/JSD7uW1yFhSVHm1dJX0AWh82UTyZvPzBCwLZEDO+2WTF4dDRBhSnJLhIz
Twkyaar315UyJ6CdWeXjDD7dN35syBXLuay2UHD2QTfiyMEke1S8R0EVDaW6Cjt4
UAKQXcpjXF4lA6aySj8BN15l+ov0f1H9aMpcDqqvJklff45zqKpXsO3/3+Jwtr9i
4DgGt7GTk0VHRVW709hLv/hYrwU=
-----END CERTIFICATE-----
3.2.3 openssl 解析内容
bash
openssl x509 \
-in certificate.crt \
-text \
-noout
- 细心观察会发现,证书中有两个Signature Algorithm
-
一个在tbs区域(签名内)
-
一个不在tbs区域
两个字段必须保持一致,验证者应检查其一致性。这样可以确保证书内部声明的签名算法与实际用于验证签名的算法完全一致,避免由于编码错误、实现缺陷或证书构造异常导致的算法信息不一致。Certificate:
Data:
Version: 1 (0x0)
Serial Number:
2a:99:7f:18:f6:f8:ae:6f:92:ef:10:16:bd:c6:cd:66:58:bb:2f:ed
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = CN, ST = ZJ, L = HZ, O = root_CA, OU = test1, CN = root
Validity
Not Before: Jul 28 22:47:10 2026 GMT
Not After : Jul 28 22:47:10 2027 GMT
Subject: C = CN, ST = zhejiang, L = hangzhou, O = test_tech, OU = tech, CN = manbushuhai, emailAddress = xxx
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:f3:4c:fb:5e:d6:fd:89:ba:c7:14:73:5e:dc:95:
0f:46:97:20:17:ef:b6:cd:23:0a:c9:7a:54:d8:a9:
56:1a:f4:8f:d1:94:fd:7f:69:21:03:8f:bd:b6:2c:
d3:f4:bf:0c:71:66:ef:a4:12:48:f5:0f:62:cd:e2:
ed:65:43:e8:34:a0:44:8a:68:60:b1:3c:30:ad:61:
24:e4:6d:71:2c:b2:d8:42:92:b4:1c:98:c8:ca:e4:
0c:d0:71:c4:20:ed:da:a7:5b:c9:6f:c5:22:ca:f0:
e3:ee:21:ea:07:95:3a:23:f8:32:2b:78:63:67:43:
1f:3b:7c:76:4b:90:cc:d3:02:fa:59:be:9f:75:c3:
e0:5b:0a:76:55:1b:43:d3:68:3b:e3:d8:77:76:f5:
0c:7b:e3:4d:fe:c5:39:d9:98:71:e3:20:e7:a8:3d:
48:e5:05:18:e5:ae:31:a4:e1:db:e2:c7:c5:e7:48:
bf:4c:0d:72:bb:0b:a3:03:ac:f3:39:65:b5:3f:45:
d6:7c:0d:11:3b:80:54:03:7a:fb:ac:b7:71:a3:bf:
c9:d3:4b:fa:e6:92:23:c5:20:e5:56:3e:ca:64:41:
0d:ee:c3:85:8c:a3:41:49:a6:40:43:82:a6:7d:79:
b4:ff:a5:b3:21:72:c3:16:bf:15:b9:7d:eb:ba:cd:
dd:bf
Exponent: 65537 (0x10001)
Signature Algorithm: sha256WithRSAEncryption
Signature Value:
08:4d:0c:c1:31:dc:e1:72:d6:78:92:8b:58:1a:bd:2f:fa:ba:
63:66:81:c3:5d:1e:66:f2:9c:cc:34:1b:6b:27:4a:7b:d7:17:
72:a2:d0:3c:fa:d5:d5:e2:3d:10:9b:31:f8:2f:ec:a6:24:dc:
2f:de:21:7d:32:d6:c0:37:2b:0a:17:04:43:d1:af:71:d5:4b:
a4:ce:24:7b:7d:d8:41:be:a8:d8:ea:81:82:2e:a5:6b:a6:a5:
68:a7:c8:4a:3f:55:f6:e8:bb:cc:1a:3f:e6:ba:ce:44:8e:d0:
7c:71:6b:03:5e:83:bd:94:56:4b:c3:bc:95:66:cd:82:9c:12:
fd:c6:2a:53:75:06:85:18:cf:72:45:16:3e:40:17:0a:d5:aa:
32:ed:34:c1:bc:0a:6e:0b:92:a6:23:16:17:e0:e7:04:49:72:
ab:85:0e:74:4c:e9:39:13:37:53:14:3a:56:10:c1:b5:d8:b5:
2e:01:10:3c:03:19:92:29:93:6a:e6:55:cb:0d:da:71:a8:55:
c1:10:27:23:f7:f9:50:a4:77:5d:3b:c0:ce:ad:9a:10:bb:0d:
2e:cf:61:fc:0c:9f:2f:68:37:61:de:33:cc:55:0e:57:4c:58:
a4:77:17:d7:b7:a0:02:ca:0e:93:82:8f:c0:e5:1b:e0:9e:1b:
84:2e:6f:58:bd:28:ef:c6:ab:18:17:62:61:38:c0:73:76:a5:
dd:4a:97:1f:c7:b8:14:d9:04:0c:d9:a6:c6:eb:32:a2:70:9c:
dd:85:89:e3:49:e8:0a:e4:62:85:f0:0e:a4:d6:43:73:09:71:
f1:46:c2:84:3e:b9:4a:44:46:9d:36:bf:ae:88:24:ed:b9:c5:
80:19:21:4d:ee:9a:13:1f:6b:cd:bd:29:8a:d7:5e:13:b9:6a:
09:cd:d8:1e:98:4c:de:ab:fe:e6:ff:c9:48:3e:ee:5b:5c:85:
85:25:47:9b:57:49:5f:40:16:87:cd:94:4f:26:6f:3f:30:42:
c0:b6:44:0c:ef:b6:59:31:78:74:34:41:85:29:c9:2e:12:33:
4f:09:32:69:aa:f7:d7:95:32:27:a0:9d:59:e5:e3:0c:3e:dd:
37:7e:6c:c8:15:cb:b9:ac:b6:50:70:f6:41:37:e2:c8:c1:24:
7b:54:bc:47:41:15:0d:a5:ba:0a:3b:78:50:02:90:5d:ca:63:
5c:5e:25:03:a6:b2:4a:3f:01:37:5e:65:fa:8b:f4:7f:51:fd:
68:ca:5c:0e:aa:af:26:49:5f:7f:8e:73:a8:aa:57:b0:ed:ff:
df:e2:70:b6:bf:62:e0:38:06:b7:b1:93:93:45:47:45:55:bb:
d3:d8:4b:bf:f8:58:af:05
-
3.2.4 使用ASN.1查看
openssl x509 \
-in certificate.crt \
-outform DER \
-out certificate.der
