中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. "); //-->

        博客專(zhuān)欄

        EEPW首頁(yè) > 博客 > X.509證書(shū)的編碼及解析:程序解析以及winhex模板解析

        X.509證書(shū)的編碼及解析:程序解析以及winhex模板解析

        發(fā)布人:電子禪石 時(shí)間:2021-08-09 來(lái)源:工程師 發(fā)布文章

        一、證書(shū)的整體結(jié)構(gòu):證書(shū)內(nèi)容、簽名算法、簽名結(jié)果。

        用ASN.1語(yǔ)法描述如下:

        Certificate::=SEQUENCE{
            tbsCertificate      TBSCertificate,
            signatureAlgorithm  AlgorithmIdentifier,
            signatureValue      BIT STRING
        }

        其中,簽名算法為CA對(duì)tbsCertificate進(jìn)行簽名所使用的算法;類(lèi)型為AlgorithmIdentifier,其ASN.1語(yǔ)法描述如下:

        AlgorithmIdentifier::=SEQUENCE{
            algorithm       OBJECT IDENTIFIER,
            parameters      ANY DEFINED BY algorithm OPTIONAL
        }

        其中,algorithm給出了算法的OID;可選的parameters給出算法的參數(shù)。

        需要注意,algorithm同時(shí)說(shuō)明了雜湊算法和數(shù)字簽名算法,常見(jiàn)的有:(1)MD5wihRSAEncryption, MD5 Hash函數(shù)和RSA簽名算法配合使用,OID為1.2.840.113549.1.1.4。(2)SHA1withRSAEncryption, SHA-1 Hash函數(shù)和RSA簽名算法配合使用,OID為1.2.840.113549.1.1.5。

        簽名結(jié)果是CA對(duì)tbsCertificate進(jìn)行簽名的結(jié)果,類(lèi)型為BIT STRING。

        證書(shū)內(nèi)容是需要被CA簽名的信息,ASN.1語(yǔ)法描述如下:

        復(fù)制代碼
        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
        }
        復(fù)制代碼

        其中,issuerUniqueID和subjectUniqueID只能在版本2或者3中出現(xiàn);extensions只能在版本3中出現(xiàn)。

         

        下面我們逐一說(shuō)明TBSCertificate中的每一個(gè)字段。

        1>版本號(hào)

        版本(version)為整數(shù)格式。到目前為止,證書(shū)格式的版本只有v1、v2、v3,分別用整數(shù)0、1、2表示。

        其類(lèi)型Version的ASN.1描述如下:

        Version::=INTEGER {v1(0),v2(1),v3(2)}

        目前最常用的版本是v3。

        2>序列號(hào)

        證書(shū)序列號(hào)(serialNumber)為整數(shù)格式。

        其類(lèi)型CertificateSerialNumber的ASN.1描述如下:

        CertificateSerialNumber::=INTEGER

        證書(shū)序列號(hào)用來(lái)在某一個(gè)CA范圍內(nèi)唯一地標(biāo)識(shí)一張證書(shū)。由此,“簽發(fā)者”和“證書(shū)序列號(hào)”配合起來(lái)就能唯一地標(biāo)識(shí)一張數(shù)字證書(shū)。在很多PKI的通信協(xié)議中使用的就是這種方式。

        RFC 3280標(biāo)準(zhǔn)要求證書(shū)序列號(hào)必須是正整數(shù),且長(zhǎng)度不應(yīng)該大于20字節(jié)。

        3>簽名算法

        簽名算法(signature)給出了CA簽發(fā)證書(shū)時(shí)所使用的數(shù)字簽名算法,它的類(lèi)型與signatureAlgorithm的類(lèi)型相同,都為AlgorithmIdentifier,它們的值必須一致,否則該證書(shū)無(wú)效。

        4>簽發(fā)者和主體

        證書(shū)的簽發(fā)者(issuer)和證書(shū)主體(subject)分別標(biāo)識(shí)了簽發(fā)證書(shū)的CA實(shí)體和證書(shū)持有者實(shí)體,兩者類(lèi)型均為Name。ASN.1描述如下:

        復(fù)制代碼
        Name::=CHOICE{
            RDNSequence
        }
        RDNSequence::=SEQUENCE OF RelativeDistinguishedName
        RelativeDistinguishedName::=SET OF AttributeTypeAndValue
        AttributeTypeAndValue::=SEQUENCE{
            type    AttributeType,
            value   AttributeValue
        }
        AttributeType::=OBJECT IDENTIFIER
        AttributeValue::=ANY DEFINED BY AttributeType
        復(fù)制代碼

        證書(shū)的簽發(fā)者和證書(shū)主體用X.509 DN表示,DN是由RDN構(gòu)成的序列。RDN用“屬性類(lèi)型=屬性值”的形式表示。常用的屬性類(lèi)型名稱(chēng)以及簡(jiǎn)寫(xiě)如下:

        常用RDN屬性類(lèi)型
        屬性類(lèi)型名稱(chēng)含義簡(jiǎn)寫(xiě)
        Common Name通用名稱(chēng)CN
        Organizational Unit name機(jī)構(gòu)單元名稱(chēng)OU
        Organization name機(jī)構(gòu)名O
        Locality地理位置L
        State or province name州/省名S
        Country國(guó)名C

        5>有效期

        證書(shū)有效期(validity)給出證書(shū)的有效使用期,包含起、止兩個(gè)時(shí)間值。時(shí)間值可以使用UTCTime或者GeneralizedTime的形式表示。ASN.1描述如下:

        復(fù)制代碼
        Validity::=SEQUENCE{
            notBefore       Time,
            notAfter        Time
        }
        Time::=CHOICE{
            utcTime         UTCTime,
            generalTime     GeneralizedTime
        }
        復(fù)制代碼

        6>主體公鑰信息

        主體公鑰信息(subjectPublicKeyInfo)給出了證書(shū)所綁定的加密算法和公鑰。其ASN.1描述如下:

        SubjectPublicKeyInfo::=SEQUENCE{
            algorithm           AlgorithmIdentifier,
            subjectPublicKey    BIT STRING
        }

        其中,algorithm表示被綁定的、證書(shū)主體持有的公鑰密碼算法;subjectPublicKey是具體的公鑰數(shù)據(jù),內(nèi)容和格式依算法不同而異。對(duì)于RSA算法,它包含公鑰參數(shù)e和n。

        7>簽發(fā)者唯一標(biāo)識(shí)符和主體唯一標(biāo)識(shí)符

        簽發(fā)者唯一標(biāo)識(shí)符(issuerUniqueID)和主體唯一標(biāo)識(shí)符(subjectUniqueID)給出了證書(shū)簽發(fā)者和證書(shū)主體的唯一標(biāo)識(shí)符。UniqueIdentifier類(lèi)型的ASN.1描述如下:

        UniqueIdentifier::=BIT STRING

         

        二、證書(shū)編碼

        針對(duì)ASN.1的語(yǔ)法,編碼可以采用“TLV”方式,即依次對(duì)數(shù)據(jù)的類(lèi)型(type)、長(zhǎng)度(length)、值(value)編碼,這樣就可以完整地表示一個(gè)特定類(lèi)型的數(shù)據(jù)。“TLV”方式的編碼有多種,下面介紹DER這種編碼方式。都是big-endian字節(jié)序。

        1.簡(jiǎn)單類(lèi)型的編碼

        1>BOOLEAN:01

        布爾類(lèi)型,兩種取值:TRUE(0xFF)、FALSE(0x00)。

        編碼為:

                T      L      V
        TRUE    01     01     FF
        FALSE   01     01     00

        2>INTEGER:02

        整數(shù)類(lèi)型。兩種情況:

        第一種,數(shù)據(jù)長(zhǎng)度不大于0x7F,稱(chēng)為“短形式”,length占1字節(jié),直接把長(zhǎng)度賦給length。舉例:0x123456的DER編碼為:

        T   L   V02  03  12  34 56

        第二種,數(shù)據(jù)長(zhǎng)度大于0x7F,稱(chēng)為“長(zhǎng)形式”,把數(shù)據(jù)長(zhǎng)度L表示為字節(jié)碼,計(jì)算其長(zhǎng)度n,然后把n與0x80進(jìn)行“位或”運(yùn)算的結(jié)果賦給length的第一個(gè)字節(jié)。舉例:0x1234...34(長(zhǎng)0100字節(jié)),即n=2,編碼為:

        T   L           V02  82  01  00  12  34 ...  34

        此外,對(duì)于整數(shù),還有正負(fù)的問(wèn)題。規(guī)定value的最高位表示符號(hào)---0(+) 1(-)  負(fù)數(shù)用補(bǔ)碼表示。

        1)對(duì)于正數(shù),如最高位為1,則向左擴(kuò)展00。

        2)對(duì)于負(fù)數(shù),如其補(bǔ)碼的最高位為0,則向左擴(kuò)展FF。

        3>BIT STRING:03

        比特串的長(zhǎng)度可能不是8的倍數(shù),而DER編碼以字節(jié)為單位。故而,如果需要,則在比特串的最后填若干位“0”,使其長(zhǎng)度達(dá)到8的倍數(shù);在最前面增加1字節(jié),寫(xiě)明填充的位數(shù)。特別注意:value部分的第一字節(jié),即表示填充位數(shù)的那個(gè)字節(jié),也要計(jì)入數(shù)據(jù)的總長(zhǎng)度。如果不需要填充,則第一字節(jié)也需要用00來(lái)表示填充位數(shù)。舉例:1011010010編碼為:

        T   L   V03  03  06  B4 80

        4>OCTET STRING:04

        字節(jié)碼串。舉例:AB CD EF 01 23的編碼為:

        T   L   V04  05  AB  CD  EF  01  23

        5>NULL:05

        編碼是固定的,value部分為空,一共兩字節(jié):

        T   L05  00

        6>OBJECT IDENTIFIER:06

        對(duì)象標(biāo)識(shí)符(OID),是一個(gè)用“.”隔開(kāi)的非負(fù)整數(shù)組成的序列。下面說(shuō)下OID的編碼設(shè)計(jì):設(shè)OID=V1.V2.V3.V4.V5....Vn,則DER編碼的value部分規(guī)則如下:(1)計(jì)算40*V1+V2作為第一字節(jié);(2)將Vi(i>=3)表示為128進(jìn)制,每一個(gè)128進(jìn)制位作為一個(gè)字節(jié),再將除最后一個(gè)字節(jié)外的所有字節(jié)的最高位置1;(3)依次排列,就得到了value部分。舉例:OID=1.2.840.11359.1.1的編碼如下:

        說(shuō)明:Vi的最后一個(gè)字節(jié)不對(duì)最高位置1,系統(tǒng)以此來(lái)識(shí)別這里是這個(gè)字段的最后一字節(jié)。

        7>PrintableString:13

        表示任意長(zhǎng)度的ASCII字符串。舉例:“Hello, world”的編碼為:

        T   L   V13  0C  48  65  6C  6C  6F  2C  20  77  6F  72  6C  64

        8>UTCTime:17

        表示時(shí)間,可以用GMT格林威治時(shí)間(結(jié)尾標(biāo)“Z”)來(lái)表示,或者是用本地時(shí)間和相對(duì)于GMT的偏移量來(lái)表示。

        UTCTime的格式如下多種:
        YYMMDDhhmmZ
        YYMMDDhhmm+hh'mm'
        YYMMDDhhmm-hh'mm'
        YYMMDDhhmmssZ
        YYMMDDhhmmss+hh'mm'
        YYMMDDhhmmss-hh'mm'

        其中,

        YY:年的最后2位
        MM:月,01-12
        DD:日,01-31
        hh:小時(shí),00-23
        mm:分鐘,00-59
        ss:秒,00-59
        Z/+/-:Z表示GMT時(shí)間,+/-表示本地時(shí)間與GMT時(shí)間的差距
        hh’:與GMT的差
        mm’:與GMT的差

        舉例:北京時(shí)間2008年8月8日晚8時(shí)表示成UTCTime為:080808120000Z 或 080808200000-0800 其編碼為:

        T   L   V17  0D  30  38  30  38  30  38  31  32  30  30  30  30  5A
        或
        T   L   V17  11  30  38  30  38  30  38  32  30  30  30  30  30  2D  30  38  30  30

        9>GeneralizedTime:18

        與UTCTime類(lèi)似,差別只在于用4位數(shù)字表示“年”,以及“秒”可精確到千分位。舉例:北京時(shí)間2008年8月8日晚8時(shí)1分2.345秒表示成GeneralizedTime為:20080808120102.345Z 或 20080808200102.345-0800 其編碼為:

        T   L   V18  13  32  30  30  38  30  38  30  38  31  32  30  31  30  32  2E  33  34  35  5A
        或
        T   L   V18  17  32  30  30  38  30  38  30  38  32  30  30  31  30  32  2E  33  34  35  2D  30  38  30  30

        2.構(gòu)造類(lèi)型數(shù)據(jù)的編碼

        1>序列構(gòu)造類(lèi)型:30

        SEQUENCE與SEQUENCE OF的type相同,都是30。value部分為序列內(nèi)所有項(xiàng)目的編碼的依次排列。length為這些項(xiàng)目編碼的總長(zhǎng)度。舉例:一天中幾次溫度測(cè)量的結(jié)果:temperatureInADay SEQUENCE(7) OF INTEGER::={21,15,5,-2,5,10,5}, 其DER編碼為:

        復(fù)制代碼
        T   L   V30  15  02  01  15
                02  01  0F        02  01  05
                02  01  FE        02  01  05
                02  01  0A        02  01  05
        復(fù)制代碼

        構(gòu)造類(lèi)型的定義中,常常包含CHOICE、ANY、OPTIONAL、DEFAULT等關(guān)鍵字,其編碼規(guī)則如下:

        (1)CHOICE

        多選一,按照實(shí)際選中的類(lèi)型編碼。舉例:

        Time::=CHOICE{
            utcTime         UTCTime,
            generalizedTime GeneralizedTime
        }

        若實(shí)際用到的類(lèi)型是UTCTime,則數(shù)據(jù)用UTCTime的編碼規(guī)則編碼。

        (2)ANY

        類(lèi)型依賴(lài)于另一個(gè)域的值,則按照實(shí)際類(lèi)型編碼。舉例:

        AlgorithmIdentifier::=SEQUENCE{
            algorithm       OBJECT IDENTIFIER,
            parameters      ANY DEFINED BY algorithm OPTIONAL
        }

        若algorithm的值表示RSA,則parameters按RSA算法的參數(shù)類(lèi)型編碼;若algorithm的值表示Diffie-Hellman算法,則parameters按Diffie-Hellman算法的參數(shù)類(lèi)型編碼。

        (3)OPTIONAL

        所標(biāo)記的字段在實(shí)際中可能存在,也可能不存在。如果有值,則編碼;如果無(wú)值,則直接跳過(guò)。舉例:

        AlgorithmIdentifier::=SEQUENCE{
            algorithm       OBJECT IDENTIFIER,
            parameters      ANY DEFINED BY algorithm OPTIONAL
        }

        實(shí)際中,如果沒(méi)有參數(shù)parameters,則相當(dāng)于

        AlgorithmIdentifier::=SEQUENCE{
            algorithm       OBJECT IDENTIFIER
        }

        (4)DEFAULT

        如果所標(biāo)記的字段在實(shí)際中正好等于缺省值,則可以編碼也可以不編碼,相當(dāng)于是OPTIONAL;如果不等于缺省值,則應(yīng)該如實(shí)編碼。舉例:

        Certificate::=SEQUENCE{
            version           Version DEFAULT 0
            ......
        }

        若version的值恰好等于0(缺省值),則可以不編碼;否則,必須按其類(lèi)型編碼。

        2>集合構(gòu)造類(lèi)型:31

        SET和SET OF的type都是31,value部分包括集合內(nèi)所有項(xiàng)目的編碼,length為其總長(zhǎng)度。需要注意的是,集合構(gòu)造類(lèi)型中的各字段是并列的,邏輯上不分先后,但為了編碼的唯一性,在DER編碼中,編碼的排列是有一定順序的。SET按標(biāo)簽的順序排列。舉例:

        Name::=SET{
            surname     [0] PrintableString,
            mid-name    [1] PrintableString,
            first-name  [2] PrintableString
        }

        編碼時(shí)則按照surname,mid-name,first-name的順序。

        SET OF按字典升序排列,即將各項(xiàng)目的DER結(jié)果看做字節(jié)碼從小到大排列。舉例:一天中幾次溫度測(cè)量的結(jié)果:temperatureInADay SET(7) OF INTEGER::={21,15,5,-2,5,10,5}, 其DER編碼為:

        復(fù)制代碼
        T   L   V30  15  02  01  05
                02  01  05
                02  01  05
                02  01  0A        02  01  0F        02  01  15
                02  01  FE
        復(fù)制代碼

        由于排序需要一定的時(shí)間和空間代價(jià),故而實(shí)際情況中,應(yīng)避免使用集合構(gòu)造類(lèi)型。

        3.標(biāo)簽

        僅僅以上的編碼規(guī)則是不夠的,會(huì)有些出現(xiàn)歧義的情況。比如:有相鄰的字段屬于相同的數(shù)據(jù)類(lèi)型。type相同,則根據(jù)編碼的排列順序來(lái)區(qū)分他們。一旦其中有字段是可選的,解碼時(shí)就不能再僅僅根據(jù)排列順序來(lái)判斷下一個(gè)是哪個(gè)字段了,產(chǎn)生歧義。故而,引入了標(biāo)簽,目的是把相同的type標(biāo)簽為不同的type,以便區(qū)分。

        標(biāo)簽分為隱式標(biāo)簽和顯式標(biāo)簽兩種。分別如下:

        隱式標(biāo)簽:

        舉例:

        復(fù)制代碼
        Contact::=SEQUENCE{
            name                        PrintableString,
            sex                         BOOLEAN,
            title       [0] IMPLICIT    PrintableString OPTIONAL,
            locality    [1] IMPLICIT    PrintableString OPTIONAL,
            telephone   [2] IMPLICIT    PrintableString OPTIONAL,
            fax         [3] IMPLICIT    PrintableString OPTIONAL
        }
        復(fù)制代碼

        DER編碼時(shí),對(duì)于加了標(biāo)簽的項(xiàng)目,按如下規(guī)則編碼:

        對(duì)于簡(jiǎn)單類(lèi)型,type=80+tag序號(hào);對(duì)于構(gòu)造類(lèi)型,type=A0+tag序號(hào)。length和value不變。

        例如,上例中如果項(xiàng)目fax被賦值為“86-10-12345678”,則編碼為

        T   L   V83  0E  38  36  2D  31  30  2D  31  32  33  34  35  36  37  38

        顯式標(biāo)簽:

        舉例:(隱式標(biāo)簽的例子)

        復(fù)制代碼
        Record::=SEQUENCE{
            ......
            time    [1] IMPLICIT    Time    OPTIONAL,
            ......
        }
        Time::=CHOICE{
            utcTime             UTCTime,
            generalizedTime     GeneralizedTime
        }
        復(fù)制代碼

        假設(shè)time被賦值為UTCTime類(lèi)型的值080808120000Z,而由于隱式標(biāo)簽的type編碼覆蓋了表示這一類(lèi)型的type編碼,導(dǎo)致編碼時(shí)無(wú)法判斷time究竟是哪種類(lèi)型,造成混亂。于是這里需要使用顯式標(biāo)簽。運(yùn)用顯式標(biāo)簽,上例描述為:

        復(fù)制代碼
        Record::=SEQUENCE{
            ......
            time    [1] EXPLICIT    Time    OPTIONAL,
            ......
        }
        Time::=CHOICE{
            utcTime             UTCTime,
            generalizedTime     GeneralizedTime
        }
        復(fù)制代碼

        編碼規(guī)則如下:

        T           L                       V
        A0+Tag序號(hào)  原TLV格式編碼的總長(zhǎng)度   原TLV格式編碼

        上例中time=080808120000Z的編碼為:

        T   L   V
        A1  0F  17  0D  30  38  30  38  30  38  31  32  30  30  30  30  5A

        事實(shí)上,顯式標(biāo)簽就是在原編碼外再封裝一層。

        三、證書(shū)解析 C程序

        X.509證書(shū)的編碼及解析:程序解析以及winhex模板解析 - jiu~ - 博客園 (cnblogs.com)

        *博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



        關(guān)鍵詞: x509

        技術(shù)專(zhuān)區(qū)

        關(guān)閉