数字证书基础详解
证书结构以及常见扩展项用途
证书结构
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 协议 ,转载请注明出处!