CH5 PKI基本结构
PKI组件
PKI系统的核心组件包括:
- CA(Certificate Authority)认证机构:
- 权威第三方,用于签发和管理数字证书。
- 包括 根CA 和 子CA。
- RA(Registration Authority)注册机构:
- 负责证书申请的身份验证,减轻CA的负担。
- Repository:
- 用于发布证书和CRL(证书撤销列表),支持多种访问协议(HTTP、FTP、LDAP等)。
- CRL Issuer:
- 专门负责签发和发布证书撤销列表(CRL)。
- OCSP Server:
- 提供在线证书状态查询服务。
- 订户(Subscriber):
- 拥有证书并使用证书进行通信的实体(如用户、设备)。
- 用户(User):
- 使用证书来验证通信对方身份的实体。
CA的结构一步步完善过程
- 最简单的PKI结构:
- 仅包括一个CA和订户。
- CA直接处理所有证书签发和管理工作。
- 引入RA(Registration Authority):
- 负责身份验证,减轻CA的负担。
- RA可并行处理多个申请。
- 分层CA结构:
- 根CA签发自签名证书,负责签发子CA证书。
- 子CA直接与订户交互,签发订户证书。
- 根CA通常离线以增强安全性,子CA保持在线。
- 引入Repository:
- 用于发布证书、CRL及其他信息。
- 提供多种访问接口,提升用户获取证书的便利性。
- 进一步优化:
- 引入专门的CRL Issuer。
- 增加OCSP服务器以减少撤销信息延迟。
CRL(证书撤销列表)的概念
- 定义: 包含已被撤销但仍在有效期内的证书序列号的列表。
- 功能:
- 防止使用被撤销的证书进行通信。
- 工作流程:
- 订户向RA申请撤销证书。
- RA审核通过后通知CA。
- CA定期签发CRL,并发布至Repository。
- 特点:
- 定期更新(通常为24小时)。
- 内容包含撤销证书的序列号和其他基本信息。
- CRL文件可能较大,可能影响效率。
OCSP(在线证书状态协议)的概念
- 定义: 用于实时查询证书状态的协议。
- 流程:
- PKI用户向OCSP服务器发送查询请求。
- OCSP服务器返回证书状态(Good、Revoked、Unknown)。
- 优势:
- 减少CRL文件缓存需求。
- 提供实时的撤销状态信息。
- 安全需求:
- 数据源鉴别:响应需签名以确保来源可信。
- 完整性:防止数据篡改。
- 防重放攻击:响应中包含时间戳。
谁的证书,颁发给谁
- 谁的证书?
- 证书属于 订户(Subscriber),如个人、设备、组织。
- 颁发给谁?
- 由CA颁发。
- 根CA颁发给子CA,子CA颁发给最终订户
证书链示例:
- 根CA → 子CA → 最终订户。
- 根CA自签名,子CA和订户证书分别由上级签发。
证书包含的信息
- 基本信息:
- 证书持有者名称(订户的身份信息)。
- 颁发者名称(CA的信息)。
- 证书序列号(证书的唯一标识)。
- 有效期(起始时间和结束时间)。
- 证书公钥(持有者的公钥信息)。
- 数字签名(由CA对证书进行签名,保证真实性)。
- 其他信息(扩展字段):
- 密钥用途(如加密、签名)。
- 证书策略(使用场景和约定)。
证书的基本结构
基于 X.509版本3 标准的证书结构包括:
- 版本号:
- 指明证书版本,支持扩展功能。
- 证书序列号:
- 每个证书的唯一标识,由CA生成。
- 签发者信息(Issuer):
- CA的名称,采用X.500标准的DN(Distinguished Name)表示。
- 有效期:
- 包括起始时间和结束时间。
- 证书主题(Subject):
- 订户的名称(DN格式)。
- 公钥信息:
- 持有者的公钥及其使用的算法。
- 签名算法:
- CA用于签名的算法标识(如RSA)。
- 签名值:
- CA对证书内容的数字签名。
CH6 PKI证书编码
证书编码基本数据类型含义、关键字含义、编码格式(不考细节计
算)、消岐问题
如何将基本数据类型和关键字转化为0/1比特串-》编码
各种编码的value需要熟悉,显式标签,隐式标签
1. ASN.1 基本数据类型含义
ASN.1 是一种描述数据结构的方法,定义了一些基本的数据类型:
- INTEGER:整数类型,例如证书版本号、序列号。
- BOOLEAN:布尔类型,TRUE 或 FALSE。
- NULL:表示空值。
- OCTET STRING:字节串。
- BIT STRING:比特串。
- OBJECT IDENTIFIER (OID):对象标识符,用来唯一标识算法或扩展。
- UTCTime / GeneralizedTime:时间类型。
- SEQUENCE / SEQUENCE OF:表示有序的组合。
- SET / SET OF:表示无序的组合。
这些类型相当于 C 语言中的基本数据类型,如 int、char 等。
2. ASN.1 关键字含义
ASN.1 提供了一些关键字,用于组合数据类型以构造复杂的数据结构:
- SEQUENCE:有序组合,例如 X.509 证书的定义。
- SET:无序组合。
- CHOICE:多选项,可以是定义的任何一种类型。
- OPTIONAL:表示该字段是可选的。
- DEFAULT:字段可以有默认值。
- ANY DEFINED BY:具体类型由某个值动态决定。
例如,证书中的 AlgorithmIdentifier
是一个 SEQUENCE,包含 algorithm 和 parameter,后者可以为 OPTIONAL。
3. 编码格式(TLV 格式)
编码将 ASN.1 的数据结构转化为二进制串,常见的编码规则包括 BER、DER 和 CER。
- 编码采用TLV结构:
- T (Type):数据类型,例如 INTEGER (02)、BOOLEAN (01)。
- L (Length):数据长度。
- 如果长度 ≤ 127,使用Short Form,1 字节表示长度。
- 如果长度 > 127,使用Long Form,第一个字节指示后续长度字节数。
- V (Value):数据值。
例如,BOOLEAN 类型 TRUE
的 DER 编码为 01 01 FF
,其中:
- Type = 01(BOOLEAN 类型)。
- Length = 01(值长度为 1 字节)。
- Value = FF(TRUE)。
4. 消歧问题及解决方案
当多个字段的数据类型相同且为 OPTIONAL 时,会导致解析歧义。例如:
TBSCertificate ::= SEQUENCE {
version [0] EXPLICIT Version DEFAULT v1,
serialNumber CertificateSerialNumber,
...
}
为解决歧义:
- 使用标签 (Tag) 区分:为字段添加明确的标记。
- EXPLICIT Tag:在数据前额外嵌套一层编码,用于无歧义解析。
- IMPLICIT Tag:在 Type 中直接修改标记,不额外嵌套编码。
5. 显式标签 (Explicit Tag) 和隐式标签 (Implicit Tag)
- 显式标签 (EXPLICIT):
- 在编码中额外嵌套一层。例如:
version=2
的编码从02 01 02
变为A0 03 02 01 02
。
- 在编码中额外嵌套一层。例如:
- 隐式标签 (IMPLICIT):
- 不额外嵌套,直接在 Type 中修改。例如:
KeyIdentifier
的编码从04 02 33 77
变为80 02 33 77
。
- 不额外嵌套,直接在 Type 中修改。例如:
6. 基本数据类型和关键字转化为 0/1 比特串的过程
以 INTEGER 类型为例:
- Type (T):INTEGER 的类型值是 0x02。
- Length (L):
- 如果整数占用 1 字节,长度为 0x01。
- Value (V):
- 例如,整数
548
的二进制为02 24
(高位在前)。 - 编码结果为:
02 02 02 24
。
- 例如,整数
7. 编码 Value 的特殊情况
- OID 编码:
- 首字节 = 40 × 第一个值 + 第二个值。
- 后续值使用 128 进制表示,高位设置为 1。
- 例如,OID
1.2.840.113549
的编码为:06 09 2A 86 48 86 F7 0D
。
- BIT STRING:
- 需要填充至字节的倍数,并在首字节记录填充位数。
- 例如,比特串
01101110010111
,编码为:03 03 05 6E 57
。
8. 重点:显式标签与隐式标签的应用场景
- 隐式标签节省字节数,但改变了原始数据类型。
- 显式标签保留了原始类型,用于解决复杂结构的歧义。