Public Key Infrastructure(二)— 深入理解 X.509 证书:从 RFC 5280 到 OpenSSL 实践

文章目录

  • [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
相关推荐
重生的黑客14 小时前
Linux 进程程序替换与自定义 Shell:从 exec 函数族到命令行解释器
linux·运维·服务器·shell
北极糊的狐14 小时前
阿里云服务器-命令2-Linux 系统实时资源监视器 top 命令详解(进程级实时资源监控)
linux·运维·服务器
NOVAnet202314 小时前
IDC 权威认证,南凌科技云网融合零信任落地实践:一体化 ZTNA 平台四大核心优势
网络安全·零信任·sd-wan·sase·企业网络
实验如有神祝女士15 小时前
不同参数规模大模型在医学翻译场景的适配差异
论文阅读·人工智能·深度学习·学习·算法·语言模型·论文笔记
三言老师15 小时前
clear与history历史命令管理实操
linux·运维·服务器·网络·centos
windliang15 小时前
Claude Code 源码分析(三):一次模型回答如何流进 Agent
前端·算法·ai编程
味悲16 小时前
Linux 环境下 DNS 服务器搭建
linux·运维·服务器
greenbbLV16 小时前
中小公司积分商城选型:SaaS与私有化优劣对比分析
大数据·运维·人工智能
feasibility.17 小时前
wsl安装Ubuntu方法(含网络不稳定处理)
linux·运维·windows·ubuntu
Kyrie_kk17 小时前
Java--BigInteger 超大整数计算
java·算法