2、X.509证书标准:证书版本、序列号、签名算法、颁发者、有效期、主体、公钥、扩展项
X.509证书,说白了就是数字世界的身份证。你想想看,现实里我们靠身份证、护照来证明“我是谁”,那在网络上,设备之间怎么互相信任?靠的就是这张X.509证书。
我刚开始接触PKI时,觉得证书就是一串乱码。后来被坑过几次,才老老实实把每个字段都啃了一遍。今天咱们就把证书的“骨架”拆开看看,每个字段到底在干什么。
核心认知:X.509 v3是目前最通用的版本。你日常遇到的HTTPS证书、设备证书、代码签名证书,基本都是这个版本。v1和v2已经很少见了,除非你在维护古董系统。
2.1 证书版本(Version)
版本字段告诉你这张证书用的是哪个规范。目前有三个版本:
| 版本号 | 字段值 | 特点 |
|---|---|---|
| v1 | 0 | 最基础,没有扩展项 |
| v2 | 1 | 引入了颁发者和主体唯一标识符,但很少用 |
| v3 | 2 | 支持扩展项,功能最强大,目前主流 |
我个人习惯,只要不是写Demo,一律用v3。为什么?因为扩展项太重要了。后面你会看到,密钥用法、基本约束、主题备用名称这些关键信息,全在扩展项里。
2.2 序列号(Serial Number)
序列号是CA给每张证书分配的唯一编号。它必须保证在同一个CA下是唯一的。
我曾经遇到过一个生产事故:某厂商的CA系统序列号生成逻辑有bug,导致两张设备证书的序列号重复。结果设备上线后,证书吊销列表(CRL)无法正确匹配,整个批次设备都得重新签发。嗯,那场面,挺酸爽的。
避坑指南:序列号建议用20字节以上的随机数,别用自增整数。自增序列号容易被猜到下一张证书的编号,存在安全风险。RFC 5280也明确推荐使用至少20字节的加密随机数。
2.3 签名算法(Signature Algorithm)
这个字段告诉你怎么验证证书的签名。它包含两部分:哈希算法 + 非对称加密算法。
常见的组合有:
- SHA256-RSA:目前最主流,兼容性好
- SHA384-ECDSA:性能更好,密钥更短,IoT设备常用
- SHA256-DSA:老古董了,不建议用
你可能会问:为什么要有两个算法?简单说,哈希算法负责“压缩”数据,非对称算法负责“加密”这个压缩后的摘要。两者配合,才能既保证效率又保证安全。
2.4 颁发者(Issuer)
颁发者就是签发这张证书的CA。它用DN(Distinguished Name,可辨识名称)来表示,比如:
CN=MyCA, O=MyCompany, C=CN
这里CN是通用名称,O是组织,C是国家代码。颁发者字段必须和CA证书的主体字段完全一致,否则验证会失败。
我记得有一次排查证书链问题,查了半天发现是颁发者DN里多了一个空格。嗯,PKI就是这么严谨,一个空格都不放过你。
2.5 有效期(Validity)
有效期包含两个时间点:生效时间(notBefore)和失效时间(notAfter)。
设备证书的有效期通常比个人证书短。我见过最激进的做法是90天,最长的有5年。但说实话,设备证书有效期越长,风险越大。一旦私钥泄露,你就要吊销证书,而吊销本身也有成本。
注意:证书到期前一定要做好续期计划。我曾经见过一个工厂,因为忘记续期设备证书,导致整个生产线停机48小时。损失?嗯,够买好几台服务器了。
2.6 主体(Subject)
主体就是证书持有者的身份信息。对于设备证书,主体通常包含设备的唯一标识,比如:
CN=device-001, OU=IoT, O=MyCompany, C=CN
这里有个关键点:主体字段不是必须唯一的。真正保证唯一性的是序列号。主体只是给人看的,方便你识别这是谁的证书。
2.7 公钥(Public Key)
公钥是证书的核心。它包含两部分:算法标识和公钥值。
常见的公钥算法:
- RSA:2048位起步,4096位更安全
- ECDSA:P-256曲线是主流,P-384用于更高安全场景
- Ed25519:新兴算法,性能极好,但兼容性还在普及中
我个人建议,新项目优先考虑ECDSA P-256。性能好,密钥短,安全性足够。RSA 2048虽然也安全,但计算开销大,不适合资源受限的设备。
2.8 扩展项(Extensions)
扩展项是v3证书的精华。没有扩展项,证书就是个“裸奔”的身份证明。扩展项告诉系统:这张证书能干什么、不能干什么。
常用的扩展项:
| 扩展项名称 | OID | 作用 |
|---|---|---|
| 基本约束 | 2.5.29.19 | 标记是否为CA证书,以及路径长度 |
| 密钥用法 | 2.5.29.15 | 指定公钥用途(签名、加密、密钥协商等) |
| 扩展密钥用法 | 2.5.29.37 | 更细粒度的用途(服务器认证、客户端认证、代码签名等) |
| 主题备用名称 | 2.5.29.17 | 证书的额外身份(IP地址、DNS名称、电子邮件等) |
| CRL分发点 | 2.5.29.31 | 告诉你去哪里下载证书吊销列表 |
| 授权信息访问 | 1.3.6.1.5.5.7.1.1 | 提供CA证书的获取地址(AIA) |
这里我重点说一下基本约束。这个扩展项决定了你的证书能不能当CA用。如果ca字段为TRUE,那这张证书就可以签发其他证书。如果为FALSE,那它只能做终端实体证书。
我曾经见过一个客户,把设备证书的ca字段设成了TRUE。结果设备上线后,理论上它可以签发任意证书。嗯,这相当于给了一把万能钥匙,风险极大。
经验之谈:设备证书的扩展项一定要严格限制。只给最小必要权限。比如,一个只做TLS客户端认证的设备,扩展密钥用法里只放clientAuth就够了,别画蛇添足。
2.9 X.509证书结构总览
下面这张图把证书的完整结构画出来了,你可以对照着看:
从这张图你能看到,证书分三大部分:
- TBSCertificate:真正要被签名的数据,包含版本、序列号、签名算法、颁发者、有效期、主体、公钥、扩展项等
- 签名算法:再次声明签名算法(必须和TBSCertificate里的一致)
- 签名值:CA用私钥对TBSCertificate进行签名后的结果
验证证书时,系统会用CA的公钥解密签名值,然后和TBSCertificate的哈希值做对比。如果一致,说明证书没有被篡改过。
小技巧:用OpenSSL查看证书结构时,可以加-text参数。比如:openssl x509 -in cert.pem -text -noout。这样你能看到每个字段的原始值,对排查问题很有帮助。
好了,X.509证书的八个核心字段就讲完了。记住,证书不是一堆乱码,它是一张结构化的“身份证”。每个字段都有它的使命,理解它们,你就能读懂任何一张证书。