X.509 协议:V3版证书编码、解码规则解析
---By HengLiang Yang 2000.07.06
一、证书格式(待签名部分)
1、版本号 V3 Version
2、序列号 Serial Number
3、签名算法OID Signature Algorithm Identifier
4、签发者 Issuer(各项名字的集合)
5、有效期 Validity
生效期 NotBefore
失效期 NotAfter
6、申请者 Subject (各项名字的集合)
7、申请者公钥信息 Subject Public Key Info
算法 Algorithm
公钥PK Subject Public Key
8、签发者唯一ID Unique ID of CA
9、申请者唯一ID Unique ID of Subject
10、扩展项 Extension
标准扩展项
扩展扩展项
二、对应项解析
1、版本号 V3
DER 编码:A0 03 02(整数标志) 01(版本号长度) 02(V3);
2、序列号
DER 编码:02 (整数标志) 02(序列号长度) 12 23(长度为0x1223);
3、签名算法OID
DER 编码:30(SEQUENCE) 0D(长度) 06(后接OID长度) 09(签名算法OID的长度)
(2A 86 48 86 F7 0D 01 01 05)(SHA1WITHRSAEncrypt的OID) (05 00)(结束)
4、签发者
C 语言定义的结构为
struct CerInfo_PK_ {
// char ID[STRING_FILED_MAX_LEN]; //UniqueID号
char countryName[STRING_FILED_MAX_LEN]; //国名
char organizationName[STRING_FILED_MAX_LEN]; //组织名
char organizationalUnitName[STRING_FILED_MAX_LEN]; //部门名
char stateOrProvinceName[STRING_FILED_MAX_LEN]; //省名
char commanName[STRING_FILED_MAX_LEN]; //通用名
char localityName[STRING_FILED_MAX_LEN]; //所在地名
char email[STRING_FILED_MAX_LEN]; //email地址
char postalAddress[STRING_FILED_MAX_LEN]; //通信地址
char postalCode[STRING_FILED_MAX_LEN]; //邮政编码
char postalOfficeBox[STRING_FILED_MAX_LEN]; //邮箱
char telephoneNumber[STRING_FILED_MAX_LEN]; //电话号码
char telexNumber[STRING_FILED_MAX_LEN]; //传真号码
char title[STRING_FILED_MAX_LEN]; //头衔
char surName[STRING_FILED_MAX_LEN]; //姓0x550404
char givenName[STRING_FILED_MAX_LEN]; //名
char initials[STRING_FILED_MAX_LEN]; //曾用名
};
DER 编码:
签发者包长:
30(SEQUENCE)
82(包长用二字节表示)
01 3e(包长为0X013E,不包括前4字节);
31(SET:子包)
0b(子包长)
30 09 06 03(同上)
(55 04 06)(国名的OID)
13(PrintableString) (如果是0x1E,则表示后面的数据是unicode类型)
02(长度)
43 4e(cn:中国);
... ...
5、有效期(CTime 格式);
生效期 30 1e
17(UTCTime)
0d(长度)
(30 30 30 34 30 35 32 32 34 39 35 34 5a)(000405224954Z)
失效期 17(UTCTime)
0d(长度)
(30 33 31 32 33 31 31 35 35 39 35 39 5a)(031231155959Z)
6、申请者同签发者编码;
7、申请者公钥信息
DER 编码:
30(SEQUENCE)
81(后接一字节长度)
9f(公钥包长度为0X9F,不包括前3字节);
算法 (同3解析,这里的OID为rsa)
DER 编码:30 0d 06 09 2a 86 48 86 f7 0d 01 01 01 05 00
公钥PK
DER 编码:03(BIT STRING)
81(后接一字节长度)
8d(长度)
00(此包无用比特数为0,BIT类必有此项);
常说的DER编码公钥从这里开始
30(SEQUENCE)
81(后接一字节长度)
89(DER公钥包长度为0X89,不包括前3字节)
02(INTEGER)
81(后接一字节长度)
81(公钥N长度为0X81,不包括前3字节)
00(因N的第一字节高位为1,INTEGER数前必须加0X00,高位为0则不加)
C1 ......
(02 03 01 00 01)(公钥指数E,解析同上)
8、签发者唯一ID
DER 编码:81(签发者唯一ID标志) 11(长度) 00(固定字节) 1c ......(16字ID)
9、申请者唯一ID
DER 编码:82(申请者唯一ID标志) 11(长度) 00(固定字节) 22 ......(16字ID)
10、扩展项
标准扩展项 扩展扩展项
DER 编码:A3(扩展项标志)
82(长度字节为2)
01 5D(长度为0X015D)
30 82 XX XX
30 1F(子包)
06 03(标志以下有3字节的OID)
55 1D 23(签发者密钥标志符,即签发者的DER编码公钥的HASH(SHA1)结果)
04(OCTET STRING)
18(长度)
30(子包)
16(长度)
80(标志)
14(长度)
......(20字节签发者的DER编码公钥的HASH(SHA1)结果)
30 1D(子包)
06 03(标志以下有3字节的OID)
55 1D 0E(申请者密钥标志符,即申请者的DER编码公钥的HASH(SHA1)结果)
04(OCTET STRING)
16(长度)
04(OCTET STRING)
14(长度)
......(20字节申请者的DER编码公钥的HASH(SHA1)结果)
30 0E
06 03
55 1D 0F(KeyUsage OID)
04 04
03 02
01(1比特无效)
F6(1111011?)
30 15
06 03
55 1D 20(CertificatePolicies OID)
04 0E
30 0C
30 0A
06 08
(2B 06 01 04 01 95 18 0A)
30 5F
06 03
55 1D 11(申请者Email地址、HTTP地址 OID)
04 58
30 56
81 1A
(......)Email地址
86 38
(......)HTTP地址
30 45
06 03
55 1D 12(签发者Email地址、HTTP地址 OID)
04 3E
30 3C
81 0F
(......)Email地址
86 29
(......)HTTP地址
30 0F
06 03
55 1D 13(BasicConstraints OID)
04 05
30 03 01 01 FF(Subject Type=CA,Path Length Constraint=None)
(如果不是CA 则 30 00指明)
30 37
06 03
55 1D 1F(CRLdistpoints OID)
04 30
30 2E
30 2C
A0 2A
A0 28
86 26
(......)(HTTP地址)
30 20 06 0a
2b 06 01 04 01 a9 43 64 05 01 (OID)
04 12
16 10
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
30 22 06 0a
2b 06 01 04 01 a9 43 64 05 02 (OID)
04 14
16 12
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
30 11 06 0a
2b 06 01 04 01 a9 43 64 05 03 (OID)
04 03
16 01
31
30 11 06 0a
2b 06 01 04 01 a9 43 64 02 03 (OID)
04 03
02 01
03
30 21 06 0a
2b 06 01 04 01 a9 43 64 02 04 (OID)
04 13
16 11
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
30 19 06 0a
2b 06 01 04 01 a9 43 64 05 08 (OID)
04 0b
16 09
6f 70 65 72 61 74 6f 72 32
30 22 06 0a
2b 06 01 04 01 a9 43 64 05 09 (OID)
04 14
16 12
31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
30 1e 06 0a
2b 06 01 04 01 a9 43 64 05 0b (OID)
04 10
16 0e
31 31 31 31 31 31 31 31 31 31 31 31 31 31
30 11 06 0a
2b 06 01 04 01 a9 43 64 05 0c (OID)
04 03
16 01
31
30 11 06 0a
2b 06 01 04 01 a9 43 64 02 02 (OID)
04 03
02 01
00
30 11 06 0a
2b 06 01 04 01 a9 43 64 02 01 (OID)
04 03
16 01
31
三、部分定义
1、KeyUsage
定义 比特位 中文定义
-------------------------------------------------------
digitalSignature | 0x8000 |数字签名证书
nonRepudiation | 0x4000 |非抵赖证书
keyEncipherment | 0x2000 |密钥加密证书
dataEncipherment | 0x1000 |数据加密证书
keyAgreement | 0x0800 |密钥交换
keyCertSign | 0x0400 |签发证书
crlSign | 0x0200 |签发CRL文件
encipherOnly | 0x0100 |仅用于加密
decipherOnly | 0x0080 |仅用于解密
-------------------------------------------------------
DER编码:55 1D 0F(keyUsage OID)
04 04
03 02
01(无用比特为1)
FE(有用比特为7,即1111111?,因此,此keyUsage所拥有的权限为:
digitalSignature 数字签名证书
nonRepudiation 非抵赖证书
keyEncipherment 密钥加密证书
dataEncipherment 数据加密证书
keyAgreement 密钥交换
keyCertSign 签发证书
crlSign 签发CRL文件
);
55 1D 0F(keyUsage OID)
04 05
03 03
07(无用比特为7)
FE(有用比特为9,即111111111???????,因此,此keyUsage所拥有的权限为:
digitalSignature 数字签名证书
nonRepudiation 非抵赖证书
keyEncipherment 密钥加密证书
dataEncipherment 数据加密证书
keyAgreement 密钥交换
keyCertSign 签发证书
crlSign 签发CRL文件
encipherOnly 仅用于加密
decipherOnly 仅用于解密
);
2、CRL_revcation_reasonCode
定义 中文定义
-------------------------------------------------------
unspecified | 0 |未指定
keyCompromise | 1 |密钥泄露
caCompromise | 2 |CA遭到破坏
affiliationChanged | 3 |从属关系改变
superseded | 4 |被取代
cessationOfOperation | 5 |终止操作
certificateHold | 6 |证书挂起
removeFromCRL | 8 |从CRL文件中移出
-------------------------------------------------------