数字证书基础详解

证书结构以及常见扩展项用途

证书结构

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中才有

    }

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

CertificateSerialNumber ::= INTEGER

AlgorithmIdentifier ::= SEQUENCE {

    algorithm               OBJECT IDENTIFIER,

    parameters              ANY DEFINED BY algorithm OPTIONAL }

parameters:

Dss-Parms ::= SEQUENCE { – parameters ,DSA(DSS)算法时的parameters,

RSA算法没有此参数

    p             INTEGER,

    q             INTEGER,

    g             INTEGER }

signatureValue:

Dss-Sig-Value ::= SEQUENCE { – sha1DSA签名算法时,签名值

                  r       INTEGER,

                  s       INTEGER }

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

Validity ::= SEQUENCE {

    notBefore      Time,  -- 证书有效期起始时间

    notAfter       Time  -- 证书有效期终止时间

    }

Time ::= CHOICE {

    utcTime        UTCTime,

    generalTime    GeneralizedTime }

UniqueIdentifier ::= BIT STRING

SubjectPublicKeyInfo ::= SEQUENCE {

    algorithm            AlgorithmIdentifier, -- 公钥算法

    subjectPublicKey     BIT STRING            -- 公钥值

    }

subjectPublicKey:

RSAPublicKey ::= SEQUENCE { – RSA算法时的公钥值

     modulus            INTEGER, -- n

     publicExponent     INTEGER -- e -- }

Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension

Extension ::= SEQUENCE {

    extnID      OBJECT IDENTIFIER,

    critical    BOOLEAN DEFAULT FALSE,

    extnValue   OCTET STRING }

常见扩展项用途—RFC3280

  • authorityKeyIdentifier(证书签发者密钥标识)
    • authorityKeyIdentifier扩展项用于区分证书签发者(CA)的公钥。当证书签发者拥有多个公私钥对用于签发用户证书时,必须使用该扩展项
    • 该扩展项必须设置为非关键项(critical=FALSE)

authorityKeyIdentifier格式用ASN.1描述如下

id-ce-authorityKeyIdentifier OBJECT IDENTIFIER ::= {id-ce 35}

authorityKeyIdentifier ::= SEQUENCE{

         keyIdentifier                [0]KeyIdentifier              OPTIONAL,

         authorityCertIssuer          [1]GeneralNames               OPTIONAL,

         authorityCertSerialNumber    [2]CertificateSerialNumber    OPTIONAL

}
KeyIdentifier::=OCTET STRING

authorityKeyIdentifier基于证书签发者证书(CA证书)中的内容生成,主要有两种生成方式:基于subjectKeyIdetifier,以及基于issur和serialNumber。当基于subjectKeyIdentifier生成时,keyIdentifier通常等于证书签发者证书中的subjectKeyIdentifier。

  • subjectKeyIdentifier(证书持有者密钥标识)
    • 该扩展项用于区分证书持有者的公钥
    • 该扩展项必须设置为关键项(critical=TRUE)
    • 也可以使用递增的证书来表示

subjectKeyIdentifier格式用ASN.1描述如下

id-ce-subjectKeyIdentifier OBJECT IDENTIFIER ::= {id-ce 14}

SubjectKeyIdentifier ::= Key

subjectKeyIdentifier可以基于公钥产生,两种常用的产生方法如下:

1)将subjectPublicKey删除标识(tag)、长度(length)和无数比特个数(number of unused bits后),使用sha1算法计算获得160比特摘要值。subjectKeyIdentifier=160比特摘要值。
2)同方法1计算获得160比特摘要值。subjectKeyIdentifier=4 比特类型(‘0100’)+至少80比特摘要值

  • keyUsage
    • keyUsage扩展项用于定义证书中的公钥及其对应私钥的用途。当需要限制或约束密钥只能用于部分操作时,可以使用该扩展项。
    • 该扩展项必须设置为关键项(critical=TRUE)

keyUsage格式用ASN.1描述如下

id-ce-keyUsage OBJECT IDENTIFIER ::= {id-ce 15}

keyUsage ::= BIT STRING{

         digitalSignature             (0),

         nonRepudiation               (1),

         keyEncipherMent              (2),

         dataEncipherment             (3),

         keyAgreement                 (4),

         keyCertSign                  (5),

         cRLSign                      (6),

         encipherOnly                 (7),

         decipherOnly                 (8)

}
1)digitalSignature表示数字签名服务,可用于实体身份认证和数据完整性认证,但不可用于签发证书和CRL
2)nonRepudiation表示抗抵赖服务,可用于操作或交易的抗抵赖,但不可用于证书和CRL签发行为的抗抵赖
3)keyEncipherment用于密钥加密。当RSA密钥用于密钥管理时,需要将keyUsage设置为keyEncipherment
4)dataEncipherment用于数据加密,但不可用于密钥加密
5)keyAgreement用于密钥协商。如使用DH算法密钥进行密钥管理
5)keyCertSign用于签发和验证数字证书。当KeyUsage设置为keyCertSign时,需同时设置扩展项basicConstriants->cA=TRUE
6)cRLSign用于签发和验证CRL(包括CRL、增量CRL、ARL等)
7)encipherOnly表示只用于数据加密。仅当keyAgreement设置时,encipherOnly才有效,表示密钥只用于密钥协商过程中的数据加密
8)decipherOnly表示只用于数据解密。仅当keyAgreement设置时,decipherOnly才有效,表示密钥只用于密钥协商过程中的数据解密

  • privateKeyUsagePeriod(私钥有效期)
    • 用于定义私钥有效期,允许私钥有效期不同于证书有效期,主要用于限制签名密钥,即与证书对应的私钥不允许在私钥有效期之外进行数字签名操作
    • 该扩展项必须设置为非关键项(critical=FALSE)

privateKeyUsagePeriod格式用ASN.1描述如下:

id-ce-privateKeyUsagePeriod OBJECT IDENTIFIER ::= {id-ce 16}

privateKeyUsagePeriod ::= SEQUENCE {

         notBefore       [0]      GeneralizedTime   OPTIONAL,

         notAfter        [1]      GeneralizedTime   OPTIONAL

}

  • basicConstraints(基本限制)
    • basicConstraints扩展项用于区分证书持有者是否是CA。如果是CA则限制其认证路径的最大长度
    • 当用于终端实体证书时,该扩展项可以设置为关键项或非关键项。当用于签发用户证书的CA证书时,该扩展项必须设置为关键项,当CA证书不用于签发用户证书,只用于签发CRL时,该扩展项可以设置为关键项或非关键项。

basicContraints格式用ASN.1描述如下

id-ce-basicConstraints OBJECT IDENTIFIER ::= {id-ce 19}

basicConstraints ::= SEQUENCE {

   cA               BOOLEAN DEFAULT FALSE,

   pathConstraint   INTEGER(0..MAX)OPTIONAL

}
其中,cA表示该证书是否是CA,如果设置为FALSE,则keyUsage扩展项不能包含keyCertSign;如果设置为TRUE,而且keyUsage扩展项包含keyCertSign时,pathConstraint才有效,表示该CA证书之后认证路径中非自签名CA证书的最大数目。pathConstraint出现时必要大于或等于0,当等于0的时候表示该CA证书不能签发下级CA证书,只能签发终端实体证书,如果pathConstraint没出现,表明认证路径的长度没有限制

  • extendedKeyUsage(扩展密钥用途)
    • extendedKeyUsage扩展项用于表示证书中公钥及其对应私钥的一个或多个用途,是keyUsage扩展项基本用途或补充。通常,该扩展项只用于终端实体证书
    • 该扩展项可以设置为关键项或非关键项,由证书签发者决定。当设置为anyExtendedKeyUsage时,该扩展项应该设置为非关键项

extendedKeyUsage格式用ASN.1描述如下

id-ce-extendedKeyUsage OBJECT IDENTIFIER ::= {id-ce 37}
ExtKeyUsageSyntax ::=SEQUENCE SIZE(1..MAX) OF KeyPurposeId
KeyPurposedId ::= OBJECT IDENTIFIER

当keyUsage和extendedKeyUsage同时存在时,必须分别进行处理,该证书只能用于keyUsage和extendedKeyUsage同时允许的用途,如果KeyUsage和extendedKeyUsage所定义的用途完全互斥,没有同时允许的用途,则该证书被认为无效,不能用于任何目的

常见的扩展密钥用途用ASN.1描述如下:
anyExtendedKeyUsage OBJECT IDENTIFIER ::= {id-ce-extKeyUsage 0}

         id-kp OBJECT IDENTIFIER ::= {id-pkix 3}

         id-kp-serverAuth           OBJECT IDENTIFIER ::={id-kp 1}
         id-kp-clientAuth           OBJECT IDENTIFIER ::={id-kp 2}
         id-kp-codeSigning          OBJECT IDENTIFIER ::={id-kp 3}
         id-kp-emailProtection      OBJECT IDENTIFIER ::={id-kp 4}
         id-kp-timeStamping         OBJECT IDENTIFIER ::={id-kp 8}
         id-kp-OCSPSigning          OBJECT IDENTIFIER ::={id-kp 9}

}

其中,anyExtendedKeyUsage表示所有用途。id-kp-serverAuth表示Web服务器SSL/TLS身份认证,等同于keyUsage中的digitalSignature、keyEncipherment、keyAgreement。id-kp-clientAuth表示Web服务器SSL/TLS身份认证,等同于keyUsage中的digitalSignature、keyAgreement。id-kp-codeSigning表示可执行的代码签名,等同于keyUsage中的digitalSignature。id-kp-emailProtection表示电子邮件保护,等同于KeyUsage的digitalSignature、nonRepudiation、keyEncipherment或keyAgreement。id-kp-timestamping表示时间戳,即将某对象摘要值与时间绑定,等同于keyUsage中的digitalSignature、nonRepudiation.id-kp-OCSPSigning表示OCSP响应包签名,等同于keyUsage中的digitalSignature.nonRepudiation。

  • cRLDistributionPoints()
    • cRLDistributionPoints用于确定如何获得CRL信息
    • cRLDistributionPoints应该设置为非关键项

cRLDistributionPoints格式用ASN.1描述如下:

id-ce-cRLDistributionPoints OBJECT IDENTIFIER ::= {id-ce 31}

cRLDistributionPoints ::=SEQUENCE SIZE(1..MAX)OF DistributionPoint

DistributionPoint ::=SEQUENCE{

         distributionPoint          [0]       DistributionPointName OPTIONAL,
         reasons                    [1]       ReasonFlags    OPTIONAL,
         cRLIssuer                  [2]       GeneralNames   OPTIONAL

}

DistributionPointName ::= CHOICE{

         fullName                   [0]          GeneralNames,
         nameRelativeToCRLIssuer    [1]          RelativeDistributionPointName

}

ReasonFlags ::= BIT STRING{

   unused                     (0),
   keyCompromise              (1),            --表示密钥泄露
   cACompromise               (2),            --表示CA泄露
   affiliationChanged         (3),            --表示关系变更
   superseded                 (4),            --表示废弃
   cessationOfOperation       (5),            --表示操作终止
   certificateHold            (6),            --表示证书冻结
   privilegeWithdrawn         (7),            --表示权限撤销
   aACompromise               (8),            --表示AA泄露

}

其中,DistributionPoint类型不能只包含reasons字段,distributionPoint和cRLIssuer字段至少包含一个。如果证书签发者不是CRL签发者,则cRLIssuer字段必须存在,而且必须包含CRL签发者的DN名称。如果证书签发者也是CRL签发者,则cRLIssuer字段必须忽略,distributionPoint字段必须存在.
distributionPoint定义为DistributionPointName类型。如果distributionPoint包含多个名称值,则每个名称表示一种方法或机制,不同方法或机制能获取相同的CRL,如LDAP和HTTP。如果distributionPoint只包含单个值(nameRelativeToCRLIssuer),则表示DN项的一部分;只需将其附加到CRL签发者或证书签发者的X.500名称后即可获得CRL发布点名称;如果DistributionPoint中的cRLIssuer存在,则使用CRL签发者cRLIssuer,否则使用证书签发者。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!