2023年7月13日发(作者:)
X.509证书解析X.509证书结构版本号:表⽰证书的版本:v1,v2,v3序列号:表⽰证书的唯⼀整数,有证书发布者分配的本证书的唯⼀标识符签名算法:⽤于前证书的算法表⽰,有对象标识符加上相关的参数组成,⽤于说明本证书所⽤的签名算法。例如:SHA-1、RSA等。发布者:证书发布者的可识别名。有效期:证书有效期的时间段。本字段由Not Before和NotAfter两项组成。它们分别由UTC时间或⼀般的事件表⽰。主体:证书拥有者的可识别名,这个字段必须⾮空,除⾮证书扩展中有别名主题公钥信息:主题公钥扩展部分:发布者密钥标识符证书所含密钥的唯⼀标识符,⽤来区分同⼀证书拥有者的多对密钥密钥使⽤⼀个⽐特串,指明(限定)证书的公钥可以完成的功能或服务,如:证书签名、数据加密等CRL分布点指明CRL分布地点私钥使⽤期指明证书中与公钥相联系的私钥的使⽤期限,它也有Not Before和Not Aft证书策略由对象标识符和限定符组成,这些对象标识符说明证书的颁发和使⽤策略有关策略映射表明两个CA域之间的⼀个或多个策略对象标识符的等价关系,仅在CA证书⾥存在主体别名指出证书拥有者的别名,如电⼦邮件地址、IP地址等,别名是和DN绑定在⼀起的发布者别名指出证书颁发者的别名,如电⼦邮件地址、IP地址等,但颁发者的DN必须出现在证主题⽬录属性指出证书拥有者的⼀系列属性。可以使⽤这⼀项来传递访问控制信息。X.509证书编码X.509证书的结构是⽤ASN1(Abstract Syntax Notation One)进⾏描述数据结构,并使⽤ASN1语法进⾏编码。⽤ASN.1语法描述如下:Certificate::=SEQUENCE{ tbsCertificate TBSCertificate, signatureAlgorithm AlgorithmIdentifier, signatureValue BIT STRING}其中,签名算法为CA对tbsCertificate进⾏签名所使⽤的算法;类型为Algorithm Identifier,其ASN.1语法描述如下:AlgorithmIdentifier::=SEQUENCE{ algorithm OBJECT IDENTIFIER, parameters ANY DEFINED BY algorithm OPTIONAL}证书内容是需要被CA签名的信息,ASN.1语法描述如下:TBSCertificate::=SEQUENCE{ version [0] EXPLICIT Version DEFAULT v1, serialNumber CertificateSerialNumber, signature AlgorithmIdentifier, issuer Name, validity Validity, subject Name, subjectPublicKeyInfo SubjectPublicKeyInfo, issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL, subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL, extensions [3] EXPLICIT Extensions OPTIONAL}其中,issuerUniqueID和subjectUniqueID只能在版本2或者3中出现;extensions只能在版本3中出现.ASN1采⽤⼀个个的数据块来描述整个数据结构,每个数据块都有四个部分组成:1. 数据类型标识(⼀个字节)简单类型是不能再分解类型,如整型(INTERGER)、⽐特串(BIT STRING)、字节串(OCTET STRING)、对象标⽰符(OBJECT IDENTIFIER)、⽇期型(UTCTime)等;结构类型是由简单类型和结构类型组合⽽成的,如顺序类型(SEQUENCE, SEQUENCE OF)、选择类型(CHOICE)、集合类型等。顺序类型的数据块值由按给定顺序成员成员数据块值按照顺序组成;选择类型的数据块值由多个成员数据数据块类型中选择⼀个的数据块值;集合数据块类型由成员数据块类型的⼀个或多个值构成。2. 数据块长度(1-128个字节)若长度⼩于等于127,则⽤⼀个字节表⽰;若长度⼤于127,则⽤多个字节表⽰。第⼀个字节最⾼为1,其余7位给出实际字节长度,从第⼆个字节开始存放长度信息;若长度等于128,则标识数据块长度补丁,需要数据块结束标识结束数据块。3. 数据块的值具体编码随数据块类型不同⽽不同。4. 数据块结束标识(可选)结束标⽰字段,两个字节(0x0000),只有在长度值为不定时才会出现。代码数据结构// info中包含信息长度以及信息内容的指针,ismallc⽤于程序结束前释放内容的标识struct info { bool ismallc; int length; unsigned char* data;};//
存放解析后的信息vector
此函数处理
数据块长度(1-128个字节)(len即为从证书中读取的长度)int getLength(ifstream& file, int len) { // < 128 if (len <= 0x7F) { return len; } // > 128 int lengthOflen = len ^ 0x80; unsigned char* bytes = new unsigned char[lengthOflen]; ((char*)bytes, lengthOflen); int length = 0; for(int i=0; i
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1689250457a225779.html
评论列表(0条)