X.509数字证书结构和实例一、X.509数字证书的编码X.509证书的结构是用ASN1(AbstractSyntaxNotationOne)进行描述数据结构,并使用ASN1语法进行编码。ASN1采用一个个的数据块来描述整个数据结构,每个数据块都有四个部分组成:1、数据块数据类型标识(一个字节)数据类型包括简单类型和结构类型。简单类型是不能再分解类型,如整型(INTERGER)、比特串(BITSTRING)、字节串(OCTETSTRING)、对象标示符(OBJECTIDENTIFIER)、日期型(UTCTime)等。结构类型是由简单类型和结构类型组合而成的,如顺序类型(SEQUENCE,SEQUENCEOF)、选择类型(CHOICE)、集合类型(SET)等。顺序类型的数据块值由按给定顺序成员成员数据块值按照顺序组成,;选择类型的数据块值由多个成员数据数据块类型中选择一个的数据块值;集合数据块类型由成员数据块类型的一个或多个值构成。这个标识字节的结构如下:1.1.Bit8-bit7用来标示TAG类型,共有四种,分别是universal(00)、application(01)、context-specific(10)和private(11)。这两位为universal(00)时,bit5-bit1的值表示不同的universal的值:标记(TAG)对应类型[UNIVERSAL1]BOOLEAN[有两个值:false或true][UNIVERSAL2]INTEGER[整型值][UNIVERSAL3]BITSTRING[0位或多位][UNIVERSAL4]OCTETSTRING[0字节或多字节][UNIVERSAL5]NULL[UNIVERSAL6]OBJECTIDENTIFIER[相应于一个对象的独特标识数字][UNIVERSAL7]OBJECTDESCRIPTOR[一个对象的简称][UNIVERSAL8]EXTERNAL,INSTANCEOF[ASN.1没有定义的数据类型][UNIVERSAL9]REAL[实数值][UNIVERSAL10]ENUMERATED[数值列表,这些数据每个都有独特的标识符,作为ASN.1定义数据类型的一部分][UNIVERSAL12]UTF8String[UNIVERSAL13]RELATIVE-OID[UNIVERSAL16]SEQUENCE,SEQUENCEOF[有序数列,SEQUENCE里面的每个数值都可以是不同类型的,而SEQUENCEOF里是0个或多个类型相同的数据][UNIVERSAL17]SET,SETOF[无序数列,SET里面的每个数值都可以是不同类型的,而SETOF里是0个或多个类型相同的数据][UNIVERSAL18]NumericString[0-9以及空格][UNIVERSAL19]PrintableString[A-Z、a-z、0-9、空格以及符号'()+,-./:=?][UNIVERSAL20]TeletexString,T61String[UNIVERSAL21]VideotexString[UNIVERSAL22]IA5String[UNIVERSAL23]UTCTime[统一全球时间格式][UNIVERSAL24]GeneralizedTime[UNIVERSAL25]GraphicString[UNIVERSAL26]VisibleString,ISO646String[UNIVERSAL27]GeneralString[UNIVERSAL28]UniversalString[UNIVERSAL29]CHARACTERSTRING[UNIVERSAL30]BMPString[UNIVERSAL31]...reservedforfutureuse这两位为context-specific(10)时,bit5-bit1的值表示特殊内容:[0]–-表示证书的版本[1]–-issuerUniqueID,表示证书发行者的唯一id[2]–-subjectUniqueID,表示证书主体的唯一id[3]–-表示证书的扩展字段1.2.bit6表示是否为结构类型(1位结构类型);0则表明编码类型是简单类型。1.3.bit5-bit1是类型的TAG值。根据bit8-bit7的不同值有不同的含义,具体含义见上面的描述。如SEQUENCE类型数据块,其TAG类型位UNIVERSAL(00),属于结构类型(1),TAG值为16(10000)所以其类型标示字段值为(00110000),即为0x30。再如,证书扩展字段类型的数据块,TAG类型为(10),属结构类型(1),TAG的值为3(00011),所以其类型标示字段值为(10100011),即为0xA3。2、数据块长度(1-128个字节)长度字段,有两种编码格式。若长度值小于等于127,则用一个字节表示,bit8=0,bit7-bit1存放长度值;若长度值大于127,则用多个字节表示,可以有2到127个字节。第一个字节的第8位为1,其它低7位给出后面该域使用的字节的数量,从该域第二个字节开始给出数据的长度,高位优先。还有一种特殊情况,这个字节为0x80,表示数据块长度不定,由数据块结束标识结束数据块。3、数据块的值存放数据块的值,具体编码随数据块类型不同而不同。4、数据块结束标识(可选)结束标示字段,两个字节(0x0000),只有在长度值为不定时才会出现。二、X.509证书的结构1、X.509证书基本部分1.1.版本号.标识证书的版本(版本1、版本2或是版本3)。1.2.序列号标识证书的唯一整数,由证书颁发者分配的本证书的唯一标识符。1.3.签名用于签证书的算法标识,由对象标识符加上相关的参数组成,用于说明本证书所用的数字签名算法。例如,SHA-1和RSA的对象标识符就用来说明该数字签名是利用RSA对SHA-1杂凑加密。1.4.颁发者证书颁发者的可识别名(DN)。1.5.有效期证书有效期的时间段。本字段由”NotBefore”和”NotAfter”两项组成,它们分别由UTC时间或一般的时间表示(在RFC2459中有详细的时间表示规则)。1.6.主体证书拥有者的可识别名,这个字段必须是非空的,除非你在证书扩展中有别名。1.7.主体公钥信息主体的公钥(以及算法标识符)。1.8.颁发者唯一标识符标识符—证书颁发者的唯一标识符,仅在版本2和版本3中有要求,属于可选项。1.9.主体唯一标识符证书拥有者的唯一标识符,仅在版本2和版本3中有要求,属于可选项。2、X.509证书扩展部分可选的标准和专用的扩展(仅在版本2和版本3中使用),扩展部分的元素都有这样的结构:Extension::=SEQUENCE{extnIDOBJECTIDENTIFIER,criticalBOOLEANDEFAULTFALSE,extnValueOCTETSTRING}extnID:表示一个扩展元素的OIDcritical:表示这个扩展元素是否极重要extnValue:表示这个扩展元素的值,字符串类型。扩展部分包括:2.1.发行者密钥标识符证书所含密钥的唯一标识符,用来区分同一证书拥有者的多对密钥。2.2.密钥使用一个比特串,指明(限定)证书的公钥可以完成的功能或服务,如:证书签名、数据加密等。如果某一证书将KeyUsage扩展标记为“极重要”,而且设置为“keyCertSign”,则在SSL通信期间该证书出现时将被拒绝,因为该证书扩展表示相关私钥应只用于签写证书,而不应该用于SSL。2.3.CRL分布点指明CRL的分布地点。2.4.私钥的使用期指明证书中与公钥相联系的私钥的使用期限,它也有NotBefore和NotAfter组成。若此项不存在时,公私钥的使用期是一样的。2.5.证书策略由对象标识符和限定符组成,这些对象标识符说明证书的颁发和使用策略有关。2.6.策略映射表明两个CA域之间的一个或多个策略对象标识符的等价关系,仅在CA证书里存在。2.7.主体别名指出证书拥有者的别名,如电子邮件地址、IP地址等,别名是和DN绑定在一起的。2.8.颁发者别名指出证书颁发者的别名,如电子邮件地址、IP地址等,但颁发者的DN必须出现在证书的颁发者字段。2.9.主体目录属性指出证书拥有者的一系列属性。可以使用这一项来传递访问控制信息。三、X.509证书详细描述Certificate::=SEQUENCE{tbsCertificateTBSCertificate,--证书主体signatureAlgorithmAlgorithmIdentifier,--证书签名算法标识signatureValueBITSTRING--证书签名值,是使用signatureAlgorithm部分指定的签名算法对tbsCertificate证书主题部分签名后的值.}TBSCertificate::=SEQUENCE{version[0]EXPLICITVersionDEFAULTv1,--证书版本号serialNumberCertificateSerialNumber,--证书序列号,对同一CA所颁发的证书,序列号唯一标识证书signatureAlgorithmIdentifier,--证书签名算法标识issuerName,--证书发行者名称validityValidity,--证书有效期subjectName,--证书主体名称subjectPublicKeyInfoSubjectPublicKeyInfo,--证书公钥issuerUniqueID[1]IMPLICITUniqueIdentifierOPTIONAL,--证书发行者ID(可选),只在证书版本2、3中才有subjectUniqueID[2]IMPLICITUniqueIdentifierOPTIONAL,--证书主体ID(可选),只在证书版本2、3中才有extensions[3]EXPLICITExtensionsOPTIONAL--证书扩展段(可选),只在证书版本3中才有}Version::=INTEGER{v1(0),v2(1),v3(2)}CertificateSerialNumber::=INTEGERAlgorithmIdentifier::=SEQUENCE{algorithmOBJECTIDENTIFIER,parametersANYDEFINEDBYalgorithmOPTIONAL}parameters:Dss-Parms::=SEQUENCE{--parameters,DSA(DSS)算法时的parameters,RSA算法没有此参数pINTEGER,qINTEGER,gINTEGER}signatureValue:Dss-Sig-Value::=SEQUENCE{--sha1DSA签名算法时,签名值rINTEGER,sINTEGER}Name::=CHOICE{RDNSequence}RDNSequence::=SEQUENCEOFRelativeDistinguishedNameRelativeDistinguishedName::=SETOFAttributeTypeAndValueAttributeTypeAndValue::=SEQUENCE{typeAttributeType,valueAttributeValue}AttributeType::=OBJECTIDENTIFIERAttributeValue::=ANYDEFINEDBYAttributeTypeValidity::=SEQUENCE{notBeforeTime,--证书有效期起始时间notAfterTime--证书有效期终止时间}Time::=CHOICE{utcTimeUTCTime,generalTimeGeneralizedTime}UniqueIdentifier::=BITSTRINGSubjectPublicKeyInfo::=SEQUENCE{algorithmAlgorithmIdentifier,--公钥算法sub