X.509证书的结构是用ASN1(Abstract Syntax Notation One)进行描述数据结构,并使用ASN1语法进行编码。
ASN1采用一个个的数据块来描述整个数据结构,每个数据块都有四个部分组成:
1)数据块数据类型标识(一个字节)
这个标识字节的结构如下:
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的不同值有不同的含义2)数据块长度(1-128个字节)
长度字段,有两种编码格式。
若长度值小于等于127,则用一个字节表示,bit8 = 0, bit7-bit1 存放长度值;
若长度值大于127,则用多个字节表示,可以有2到127个字节。第一个字节的第8位为1,其它低7位给出后面该域使用的字节的数量,从该域第二个字节开始给出数据的长度,高位优先。
还有一种特殊情况,这个字节为0x80,表示数据块长度不定,由数据块结束标识结束数据块。
3)数据块的值
存放数据块的值,具体编码随数据块类型不同而不同。
4)数据块结束标识(可选)
结束标示字段,两个字节(0x0000),只有在长度值为不定时才会出现。
数字证书的结构1)X.509证书基本部分
1.1)版本号.
标识证书的版本(版本1、版本2或是版本3)。
1.2)序列号
标识证书的唯一整数,由证书颁发者分配的本证书的唯一标识符。
1.3)签名
用于签证书的算法标识,由对象标识符加上相关的参数组成,用于说明本证书所用的数字签名算法。例如,SHA-1和RSA的对象标识符就用来说明该数字签名是利用RSA对SHA-1杂凑加密。
1.4)颁发者
证书颁发者的可识别名(DN)。
1.5)有效期
证书有效期的时间段。本字段由”Not Before”和”Not After”两项组成,它们分别由UTC时间或一般的时间表示(在RFC2459中有详细的时间表示规则)。
1.6)主体
证书拥有者的可识别名,这个字段必须是非空的,除非你在证书扩展中有别名。
1.7)主体公钥信息
主体的公钥(以及算法标识符)。
1.8)颁发者唯一标识符
标识符—证书颁发者的唯一标识符,仅在版本2和版本3中有要求,属于可选项。
1.9)主体唯一标识符
证书拥有者的唯一标识符,仅在版本2和版本3中有要求,属于可选项。
2)X.509证书扩展部分
可选的标准和专用的扩展(仅在版本2和版本3中使用),扩展部分的元素都有这样的结构:
Extension ::= SEQUENCE {
extnID OBJECT IDENTIFIER,
critical BOOLEAN DEFAULT FALSE,
extnValue OCTET STRING }
extnID:表示一个扩展元素的OID
critical:表示这个扩展元素是否极重要
extnValue:表示这个扩展元素的值,字符串类型。
2)扩展部分包括:
2.1)发行者密钥标识符
证书所含密钥的唯一标识符,用来区分同一证书拥有者的多对密钥。
2.2)密钥使用
一个比特串,指明(限定)证书的公钥可以完成的功能或服务,如:证书签名、数据加密等。如果某一证书将 KeyUsage 扩展标记为“极重要”,而且设置为“keyCertSign”,则在 SSL 通信期间该证书出现时将被拒绝,因为该证书扩展表示相关私钥应只用于签写证书,而不应该用于 SSL。
2.3)CRL分布点
指明CRL的分布地点。
2.4) 私钥的使用期
指明证书中与公钥相联系的私钥的使用期限,它也有Not Before和Not After组成。若此项不存在时,公私钥的使用期是一样的。
2.5) 证书策略
由对象标识符和限定符组成,这些对象标识符说明证书的颁发和使用策略有关。
2.6) 策略映射
表明两个CA域之间的一个或多个策略对象标识符的等价关系,仅在CA证书里存在。
2.7)主体别名
指出证书拥有者的别名,如电子邮件地址、IP地址等,别名是和DN绑定在一起的。
2.8) 颁发者别名
指出证书颁发者的别名,如电子邮件地址、IP地址等,但颁发者的DN必须出现在证书的颁发者字段。
2.9)主体目录属性
指出证书拥有者的一系列属性。可以使用这一项来传递访问控制信息。
数字证书详细描述
Certificate ::= SEQUENCE {
tbsCertificate TBSCertificate, -- 证书主体
signatureAlgorithm AlgorithmIdentifier, -- 证书签名算法标识
signatureValue BIT STRING --证书签名值,是使用signatureAlgorithm部分指定的签名算法对tbsCertificate证书主题部分签名后的值.
}
TBSCertificate ::= SEQUENCE {
version [0] EXPLICIT Version DEFAULT v1, -- 证书版本号
serialNumber CertificateSerialNumber, -- 证书序列号,对同一CA所颁发的证书,序列号唯一标识证书
signature AlgorithmIdentifier, --证书签名算法标识
issuer Name, --证书发行者名称
validity Validity, --证书有效期
subject Name, --证书主体名称
subjectPublicKeyInfo SubjectPublicKeyInfo,--证书公钥
issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL,
-- 证书发行者ID(可选),只在证书版本2、3中才有
subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,
-- 证书主体ID(可选),只在证书版本2、3中才有
extensions [3] EXPLICIT Extensions OPTIONAL
-- 证书扩展段(可选),只在证书版本3中才有
}