X509_数字证书结构和实例
X.509X.509 数字证书结构和实例数字证书结构和实例 一、 X.509 数字证书的编码 X.509 证书的结构是用 ASN1(Abstract Syntax Notation One) 进行描述数据结构,并使用 ASN1 语法进行编码。 ASN1 采用一个个的数据块来描述整个数据结构,每个数据块都有四个部分组成: 1、数据块数据类型标识(一个字节) 数据类型包括简单类型和结构类型。 简单类型是不能再分解类型,如整型(INTERGER)、比特串(BIT STRING)、字节串 (OCTET STRING)、对象标示符(OBJECT IDENTIFIER)、日期型(UTCTime)等。 结构类型是由简单类型和结构类型组合而成的,如顺序类型(SEQUENCE, SEQUENCE OF)、选择类型(CHOICE) 、集合类型(SET)等。 顺序类型的数据块值由按给定顺序成员成员数据块值按照顺序组成; 选择类型的数据块值由多个成员数据数据块类型中选择一个的数据块值; 集合数据块类型由成员数据块类型的一个或多个值构成。 这个标识字节的结构如下: 1.1.Bit8-bit7 用来标示 TAG 类型,共有四种,分别是universal(00)、application(01)、 context-specific(10)和 private(11)。 1.2. Bit6 表示是否为结构类型(1 位结构类型);0 则表明编码类型是简单类型。 1.3. Bit5-bit1 是类型的 TAG值。根据 bit8-bit7 的不同值有不同的含义,具体含义见下表。 当 Bit8-bit7 为 universal(00)时,bit5-bit1 的值表示不同的 universal 的值: 标记(TAG)对应类型备注 [UNIVERSAL 1]BOOLEAN[有两个值:false 或 true] [UNIVERSAL 2]INTEGER[整型值] [UNIVERSAL 3]BIT STRING[0 位或多位] [UNIVERSAL 4]OCTET STRING[0 字节或多字节] [UNIVERSAL 5]NULL [UNIVERSAL 6]OBJECT IDENTIFIER[相应于一个对象的独特标识数字] [UNIVERSAL 7]OBJECT DESCRIPTOR [一个对象的简称] EXTERNAL, [UNIVERSAL 8][ASN.1 没有定义的数据类型] INSTANCE OF [UNIVERSAL 9]REAL[实数值] [数值列表,这些数据每个都有独特 [UNIVERSAL 10]ENUMERATED的标识符,作为 ASN.1 定义数据类 型的一部分] [UNIVERSAL 12]UTF8String [UNIVERSAL 13]RELATIVE-OID [有序数列, SEQUENCE 里面的每个 数值都可以是不同类型的,而SEQUENCE, [UNIVERSAL 16] SEQUENCE OF SEQUENCE OF 里是 0 个或多个类 型相同的数据] [无序数列,SET 里面的每个数值都 [UNIVERSAL 17]SET, SET OF可以是不同类型的, 而 SET OF里是 0 个或多个类型相同的数据] [UNIVERSAL 18]Numeric String[0-9 以及空格] [A-Z、a-z、0-9、空格以及符号 [UNIVERSAL 19]Printable String ()+,-./:=?] [UNIVERSAL 20]TeletexString, T61String VideotexString IA5String UTCTime[统一全球时间格式] GeneralizedTime GraphicString VisibleString, [UNIVERSAL 26] ISO646String [UNIVERSAL 27]GeneralString [UNIVERSAL 28]UniversalString [UNIVERSAL 29]CHARACTER STRING [UNIVERSAL 30]BMPString [UNIVERSAL 31]reserved for future use 当 Bit8-bit7 为 context-specific(10)时,bit5-bit1 的值表示特殊内容: [0] –- 表示证书的版本 [1] –- issuerUniqueID,表示证书发行者的唯一 id [2] –- subjectUniqueID,表示证书主体的唯一id [3] –- 表示证书的扩展字段 如 SEQUENCE 类型数据块,其 TAG类型位 UNIVERSAL(00),属于结构类型(1) , TAG值为 16(10000)所以其类型标示字段值为(00110000) ,即为 0 x30。再如,证书扩展 字段类型的数据块,TAG类型为(10) ,属结构类型(1) ,TAG的值为 3(00011) ,所以其 类型标示字段值为(10100011) ,即为 0 xA3。 2、数据块长度(1-128 个字节) 长度字段,有两种编码格式。 若长度值小于等于 127,则用一个字节表示,bit8 = 0, bit7-bit1 存放长度值; 若长度值大于 127,则用多个字节表示,可以有2 到 127 个字节。第一个字节的第8 位 为 1,其它低7 位给出后面该域使用的字节的数量,从该域第二个字节开始给出数据的 长度,高位优先。 还有一种特殊情况,这个字节为 0 x80,表示数据块长度不定,由数据块结束标识结束 数据块。 3、数据块的值 存放数据块的值,具体编码随数据块类型不同而不同。 4、数据块结束标识(可选) 结束标示字段,两个字节(0 x0000),只有在长度值为不定时才会出现。 二、 X.509 证书的结构 1、X.509 证书基本部分 1.1.版本号. 标识证书的版本(版本 1、版本 2 或是版本 3) 。 1.2.序列号 标识证书的唯一整数,由证书颁发者分配的本证书的唯一标识符。 1.3.签名 用于签证书的算法标识, 由对象标识符加上相关的参数组成, 用于说明本证书所用的数 字签名算法。 例如, SHA-1和RSA的对象标识符就用来说明该数字签名是利用RSA对SHA-1 杂凑加密。 [UNIVERSAL 21] [UNIVERSAL 22] [UNIVERSAL 23] [UNIVERSAL 24] [UNIVERSAL 25] 1.4.颁发者 证书颁发者的可识别名(DN) 。 1.5.有效期 证书有效期的时间段。本字段由 Not Before 和 Not After 两项组成,它们分别由UTC 时间或一般的时间表示(在RFC2459 中有详细的时间表示规则) 。 1.6.主体 证书拥有者的可识别名,这个字段必须是非空的,除非你在证书扩展中有别名。 1.7.主体公钥信息 主体的公钥(以及算法标识符) 。 1.8.颁发者唯一标识符 标识符—证书颁发者的唯一标识符,仅在版本2 和版本 3 中有要求,属于可选项。 1.9.主体唯一标识符 证书拥有者的唯一标识符,仅在版本2