X.509 证书是代表用户、计算机、服务或设备的数字文档。 证书颁发机构 (CA)、从属 CA 或注册机构负责颁发 X.509 证书。 证书包含证书使用者的公钥。 它们不包含使用者的私钥(必须安全存储)。 RFC 5280 记录公钥证书,包括它们的字段和扩展名。 公钥证书经过数字签名,通常包含以下信息:
证书使用者的信息
与使用者私钥相对应的公钥
证书颁发机构的信息
支持的加密和/或数字签名算法
用于确定证书吊销和有效性状态的信息
x.509证书定义 完整详细定义 以下内容来自RFC 52080 官方定义 https://datatracker.ietf.org/doc/html/rfc5280#autoid-103
x.509证书的完整详细ASN.1定义如下:
PKIX1Explicit88 { iso(1) identified-organization(3) dod(6) internet(1) security(5) mechanisms(5) pkix(7) id-mod(0) id-pkix1-explicit(18) } DEFINITIONS EXPLICIT TAGS ::= BEGIN -- EXPORTS ALL -- -- IMPORTS NONE -- -- UNIVERSAL Types defined in 1993 and 1998 ASN.1 -- and required by this specification UniversalString ::= [UNIVERSAL 28] IMPLICIT OCTET STRING -- UniversalString is defined in ASN.1:1993 BMPString ::= [UNIVERSAL 30] IMPLICIT OCTET STRING -- BMPString is the subtype of UniversalString and models -- the Basic Multilingual Plane of ISO/IEC 10646 UTF8String ::= [UNIVERSAL 12] IMPLICIT OCTET STRING -- The content of this type conforms to RFC 3629. -- PKIX specific OIDs id-pkix OBJECT IDENTIFIER ::= { iso(1) identified-organization(3) dod(6) internet(1) security(5) mechanisms(5) pkix(7) } -- PKIX arcs id-pe OBJECT IDENTIFIER ::= { id-pkix 1 } -- arc for private certificate extensions id-qt OBJECT IDENTIFIER ::= { id-pkix 2 } -- arc for policy qualifier types id-kp OBJECT IDENTIFIER ::= { id-pkix 3 } -- arc for extended key purpose OIDS id-ad OBJECT IDENTIFIER ::= { id-pkix 48 } -- arc for access descriptors -- policyQualifierIds for Internet policy qualifiers id-qt-cps OBJECT IDENTIFIER ::= { id-qt 1 } -- OID for CPS qualifier id-qt-unotice OBJECT IDENTIFIER ::= { id-qt 2 } -- OID for user notice qualifier -- access descriptor definitions id-ad-ocsp OBJECT IDENTIFIER ::= { id-ad 1 } id-ad-caIssuers OBJECT IDENTIFIER ::= { id-ad 2 } id-ad-timeStamping OBJECT IDENTIFIER ::= { id-ad 3 } id-ad-caRepository OBJECT IDENTIFIER ::= { id-ad 5 } -- attribute data types Attribute ::= SEQUENCE { type AttributeType, values SET OF AttributeValue } -- at least one value is required AttributeType ::= OBJECT IDENTIFIER AttributeValue ::= ANY -- DEFINED BY AttributeType AttributeTypeAndValue ::= SEQUENCE { type AttributeType, value AttributeValue } -- suggested naming attributes: Definition of the following -- information object set may be augmented to meet local -- requirements. Note that deleting members of the set may -- prevent interoperability with conforming implementations. -- presented in pairs: the AttributeType followed by the -- type definition for the corresponding AttributeValue -- Arc for standard naming attributes id-at OBJECT IDENTIFIER ::= { joint-iso-ccitt(2) ds(5) 4 } -- Naming attributes of type X520name id-at-name AttributeType ::= { id-at 41 } id-at-surname AttributeType ::= { id-at 4 } id-at-givenName AttributeType ::= { id-at 42 } id-at-initials AttributeType ::= { id-at 43 } id-at-generationQualifier AttributeType ::= { id-at 44 } -- Naming attributes of type X520Name: -- X520name ::= DirectoryString (SIZE (1..ub-name)) -- -- Expanded to avoid parameterized type: X520name ::= CHOICE { teletexString TeletexString (SIZE (1..ub-name)), printableString PrintableString (SIZE (1..ub-name)), universalString UniversalString (SIZE (1..ub-name)), utf8String UTF8String (SIZE (1..ub-name)), bmpString BMPString (SIZE (1..ub-name)) } -- Naming attributes of type X520CommonName id-at-commonName AttributeType ::= { id-at 3 } -- Naming attributes of type X520CommonName: -- X520CommonName ::= DirectoryName (SIZE (1..ub-common-name)) -- -- Expanded to avoid parameterized type: X520CommonName ::= CHOICE { teletexString TeletexString (SIZE (1..ub-common-name)), printableString PrintableString (SIZE (1..ub-common-name)), universalString UniversalString (SIZE (1..ub-common-name)), utf8String UTF8String (SIZE (1..ub-common-name)), bmpString BMPString (SIZE (1..ub-common-name)) } -- Naming attributes of type X520LocalityName id-at-localityName AttributeType ::= { id-at 7 } -- Naming attributes of type X520LocalityName: -- X520LocalityName ::= DirectoryName (SIZE (1..ub-locality-name)) -- -- Expanded to avoid parameterized type: X520LocalityName ::= CHOICE { teletexString TeletexString (SIZE (1..ub-locality-name)), printableString PrintableString (SIZE (1..ub-locality-name)), universalString UniversalString (SIZE (1..ub-locality-name)), utf8String UTF8String (SIZE (1..ub-locality-name)), bmpString BMPString (SIZE (1..ub-locality-name)) } -- Naming attributes of type X520StateOrProvinceName id-at-stateOrProvinceName AttributeType ::= { id-at 8 } -- Naming attributes of type X520StateOrProvinceName: -- X520StateOrProvinceName ::= DirectoryName (SIZE (1..ub-state-name)) -- -- Expanded to avoid parameterized type: X520StateOrProvinceName ::= CHOICE { teletexString TeletexString (SIZE (1..ub-state-name)), printableString PrintableString (SIZE (1..ub-state-name)), universalString UniversalString (SIZE (1..ub-state-name)), utf8String UTF8String (SIZE (1..ub-state-name)), bmpString BMPString (SIZE (1..ub-state-name)) } -- Naming attributes of type X520OrganizationName id-at-organizationName AttributeType ::= { id-at 10 } -- Naming attributes of type X520OrganizationName: -- X520OrganizationName ::= -- DirectoryName (SIZE (1..ub-organization-name)) -- -- Expanded to avoid parameterized type: X520OrganizationName ::= CHOICE { teletexString TeletexString (SIZE (1..ub-organization-name)), printableString PrintableString (SIZE (1..ub-organization-name)), universalString UniversalString (SIZE (1..ub-organization-name)), utf8String UTF8String (SIZE (1..ub-organization-name)), bmpString BMPString (SIZE (1..ub-organization-name)) } -- Naming attributes of type X520OrganizationalUnitName id-at-organizationalUnitName AttributeType ::= { id-at 11 } -- Naming attributes of type X520OrganizationalUnitName: -- X520OrganizationalUnitName ::= -- DirectoryName (SIZE (1..ub-organizational-unit-name)) -- -- Expanded to avoid parameterized type: X520OrganizationalUnitName ::= CHOICE { teletexString TeletexString (SIZE (1..ub-organizational-unit-name)), printableString PrintableString (SIZE (1..ub-organizational-unit-name)), universalString UniversalString (SIZE (1..ub-organizational-unit-name)), utf8String UTF8String (SIZE (1..ub-organizational-unit-name)), bmpString BMPString (SIZE (1..ub-organizational-unit-name)) } -- Naming attributes of type X520Title id-at-title AttributeType ::= { id-at 12 } -- Naming attributes of type X520Title: -- X520Title ::= DirectoryName (SIZE (1..ub-title)) -- -- Expanded to avoid parameterized type: X520Title ::= CHOICE { teletexString TeletexString (SIZE (1..ub-title)), printableString PrintableString (SIZE (1..ub-title)), universalString UniversalString (SIZE (1..ub-title)), utf8String UTF8String (SIZE (1..ub-title)), bmpString BMPString (SIZE (1..ub-title)) } -- Naming attributes of type X520dnQualifier id-at-dnQualifier AttributeType ::= { id-at 46 } X520dnQualifier ::= PrintableString -- Naming attributes of type X520countryName (digraph from IS 3166) id-at-countryName AttributeType ::= { id-at 6 } X520countryName ::= PrintableString (SIZE (2)) -- Naming attributes of type X520SerialNumber id-at-serialNumber AttributeType ::= { id-at 5 } X520SerialNumber ::= PrintableString (SIZE (1..ub-serial-number)) -- Naming attributes of type X520Pseudonym id-at-pseudonym AttributeType ::= { id-at 65 } -- Naming attributes of type X520Pseudonym: -- X520Pseudonym ::= DirectoryName (SIZE (1..ub-pseudonym)) -- -- Expanded to avoid parameterized type: X520Pseudonym ::= CHOICE { teletexString TeletexString (SIZE (1..ub-pseudonym)), printableString PrintableString (SIZE (1..ub-pseudonym)), universalString UniversalString (SIZE (1..ub-pseudonym)), utf8String UTF8String (SIZE (1..ub-pseudonym)), bmpString BMPString (SIZE (1..ub-pseudonym)) } -- Naming attributes of type DomainComponent (from RFC 4519) id-domainComponent AttributeType ::= { 0 9 2342 19200300 100 1 25 } DomainComponent ::= IA5String -- Legacy attributes pkcs-9 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 9 } id-emailAddress AttributeType ::= { pkcs-9 1 } EmailAddress ::= IA5String (SIZE (1..ub-emailaddress-length)) -- naming data types -- Name ::= CHOICE { -- only one possibility for now -- rdnSequence RDNSequence } RDNSequence ::= SEQUENCE OF RelativeDistinguishedName DistinguishedName ::= RDNSequence RelativeDistinguishedName ::= SET SIZE (1..MAX) OF AttributeTypeAndValue -- Directory string type -- DirectoryString ::= CHOICE { teletexString TeletexString (SIZE (1..MAX)), printableString PrintableString (SIZE (1..MAX)), universalString UniversalString (SIZE (1..MAX)), utf8String UTF8String (SIZE (1..MAX)), bmpString BMPString (SIZE (1..MAX)) } -- certificate and CRL specific structures begin here Certificate ::= SEQUENCE { tbsCertificate TBSCertificate, signatureAlgorithm AlgorithmIdentifier, signature BIT STRING } TBSCertificate ::= SEQUENCE { version [0] Version DEFAULT v1, serialNumber CertificateSerialNumber, signature AlgorithmIdentifier, issuer Name, validity Validity, subject Name, subjectPublicKeyInfo SubjectPublicKeyInfo, issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL, -- If present, version MUST be v2 or v3 subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL, -- If present, version MUST be v2 or v3 extensions [3] Extensions OPTIONAL -- If present, version MUST be v3 -- } Version ::= INTEGER { v1(0), v2(1), v3(2) } CertificateSerialNumber ::= INTEGER Validity ::= SEQUENCE { notBefore Time, notAfter Time } Time ::= CHOICE { utcTime UTCTime, generalTime GeneralizedTime } UniqueIdentifier ::= BIT STRING SubjectPublicKeyInfo ::= SEQUENCE { algorithm AlgorithmIdentifier, subjectPublicKey BIT STRING } Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension Extension ::= SEQUENCE { extnID OBJECT IDENTIFIER, critical BOOLEAN DEFAULT FALSE, extnValue OCTET STRING -- contains the DER encoding of an ASN.1 value -- corresponding to the extension type identified -- by extnID } -- CRL structures CertificateList ::= SEQUENCE { tbsCertList TBSCertList, signatureAlgorithm AlgorithmIdentifier, signature BIT STRING } TBSCertList ::= SEQUENCE { version Version OPTIONAL, -- if present, MUST be v2 signature AlgorithmIdentifier, issuer Name, thisUpdate Time, nextUpdate Time OPTIONAL, revokedCertificates SEQUENCE OF SEQUENCE { userCertificate CertificateSerialNumber, revocationDate Time, crlEntryExtensions Extensions OPTIONAL -- if present, version MUST be v2 } OPTIONAL, crlExtensions [0] Extensions OPTIONAL } -- if present, version MUST be v2 -- Version, Time, CertificateSerialNumber, and Extensions were -- defined earlier for use in the certificate structure AlgorithmIdentifier ::= SEQUENCE { algorithm OBJECT IDENTIFIER, parameters ANY DEFINED BY algorithm OPTIONAL } -- contains a value of the type -- registered for use with the -- algorithm object identifier value -- X.400 address syntax starts here ORAddress ::= SEQUENCE { built-in-standard-attributes BuiltInStandardAttributes, built-in-domain-defined-attributes BuiltInDomainDefinedAttributes OPTIONAL, -- see also teletex-domain-defined-attributes extension-attributes ExtensionAttributes OPTIONAL } -- Built-in Standard Attributes BuiltInStandardAttributes ::= SEQUENCE { country-name CountryName OPTIONAL, administration-domain-name AdministrationDomainName OPTIONAL, network-address [0] IMPLICIT NetworkAddress OPTIONAL, -- see also extended-network-address terminal-identifier [1] IMPLICIT TerminalIdentifier OPTIONAL, private-domain-name [2] PrivateDomainName OPTIONAL, organization-name [3] IMPLICIT OrganizationName OPTIONAL, -- see also teletex-organization-name numeric-user-identifier [4] IMPLICIT NumericUserIdentifier OPTIONAL, personal-name [5] IMPLICIT PersonalName OPTIONAL, -- see also teletex-personal-name organizational-unit-names [6] IMPLICIT OrganizationalUnitNames OPTIONAL } -- see also teletex-organizational-unit-names CountryName ::= [APPLICATION 1] CHOICE { x121-dcc-code NumericString (SIZE (ub-country-name-numeric-length)), iso-3166-alpha2-code PrintableString (SIZE (ub-country-name-alpha-length)) } AdministrationDomainName ::= [APPLICATION 2] CHOICE { numeric NumericString (SIZE (0..ub-domain-name-length)), printable PrintableString (SIZE (0..ub-domain-name-length)) } NetworkAddress ::= X121Address -- see also extended-network-address X121Address ::= NumericString (SIZE (1..ub-x121-address-length)) TerminalIdentifier ::= PrintableString (SIZE (1..ub-terminal-id-length)) PrivateDomainName ::= CHOICE { numeric NumericString (SIZE (1..ub-domain-name-length)), printable PrintableString (SIZE (1..ub-domain-name-length)) } OrganizationName ::= PrintableString (SIZE (1..ub-organization-name-length)) -- see also teletex-organization-name NumericUserIdentifier ::= NumericString (SIZE (1..ub-numeric-user-id-length)) PersonalName ::= SET { surname [0] IMPLICIT PrintableString (SIZE (1..ub-surname-length)), given-name [1] IMPLICIT PrintableString (SIZE (1..ub-given-name-length)) OPTIONAL, initials [2] IMPLICIT PrintableString (SIZE (1..ub-initials-length)) OPTIONAL, generation-qualifier [3] IMPLICIT PrintableString (SIZE (1..ub-generation-qualifier-length)) OPTIONAL } -- see also teletex-personal-name OrganizationalUnitNames ::= SEQUENCE SIZE (1..ub-organizational-units) OF OrganizationalUnitName -- see also teletex-organizational-unit-names OrganizationalUnitName ::= PrintableString (SIZE (1..ub-organizational-unit-name-length)) -- Built-in Domain-defined Attributes BuiltInDomainDefinedAttributes ::= SEQUENCE SIZE (1..ub-domain-defined-attributes) OF BuiltInDomainDefinedAttribute BuiltInDomainDefinedAttribute ::= SEQUENCE { type PrintableString (SIZE (1..ub-domain-defined-attribute-type-length)), value PrintableString (SIZE (1..ub-domain-defined-attribute-value-length)) } -- Extension Attributes ExtensionAttributes ::= SET SIZE (1..ub-extension-attributes) OF ExtensionAttribute ExtensionAttribute ::= SEQUENCE { extension-attribute-type [0] IMPLICIT INTEGER (0..ub-extension-attributes), extension-attribute-value [1] ANY DEFINED BY extension-attribute-type } -- Extension types and attribute values common-name INTEGER ::= 1 CommonName ::= PrintableString (SIZE (1..ub-common-name-length)) teletex-common-name INTEGER ::= 2 TeletexCommonName ::= TeletexString (SIZE (1..ub-common-name-length)) teletex-organization-name INTEGER ::= 3 TeletexOrganizationName ::= TeletexString (SIZE (1..ub-organization-name-length)) teletex-personal-name INTEGER ::= 4 TeletexPersonalName ::= SET { surname [0] IMPLICIT TeletexString (SIZE (1..ub-surname-length)), given-name [1] IMPLICIT TeletexString (SIZE (1..ub-given-name-length)) OPTIONAL, initials [2] IMPLICIT TeletexString (SIZE (1..ub-initials-length)) OPTIONAL, generation-qualifier [3] IMPLICIT TeletexString (SIZE (1..ub-generation-qualifier-length)) OPTIONAL } teletex-organizational-unit-names INTEGER ::= 5 TeletexOrganizationalUnitNames ::= SEQUENCE SIZE (1..ub-organizational-units) OF TeletexOrganizationalUnitName TeletexOrganizationalUnitName ::= TeletexString (SIZE (1..ub-organizational-unit-name-length)) pds-name INTEGER ::= 7 PDSName ::= PrintableString (SIZE (1..ub-pds-name-length)) physical-delivery-country-name INTEGER ::= 8 PhysicalDeliveryCountryName ::= CHOICE { x121-dcc-code NumericString (SIZE (ub-country-name-numeric-length)), iso-3166-alpha2-code PrintableString (SIZE (ub-country-name-alpha-length)) } postal-code INTEGER ::= 9 PostalCode ::= CHOICE { numeric-code NumericString (SIZE (1..ub-postal-code-length)), printable-code PrintableString (SIZE (1..ub-postal-code-length)) } physical-delivery-office-name INTEGER ::= 10 PhysicalDeliveryOfficeName ::= PDSParameter physical-delivery-office-number INTEGER ::= 11 PhysicalDeliveryOfficeNumber ::= PDSParameter extension-OR-address-components INTEGER ::= 12 ExtensionORAddressComponents ::= PDSParameter physical-delivery-personal-name INTEGER ::= 13 PhysicalDeliveryPersonalName ::= PDSParameter physical-delivery-organization-name INTEGER ::= 14 PhysicalDeliveryOrganizationName ::= PDSParameter extension-physical-delivery-address-components INTEGER ::= 15 ExtensionPhysicalDeliveryAddressComponents ::= PDSParameter unformatted-postal-address INTEGER ::= 16 UnformattedPostalAddress ::= SET { printable-address SEQUENCE SIZE (1..ub-pds-physical-address-lines) OF PrintableString (SIZE (1..ub-pds-parameter-length)) OPTIONAL, teletex-string TeletexString (SIZE (1..ub-unformatted-address-length)) OPTIONAL } street-address INTEGER ::= 17 StreetAddress ::= PDSParameter post-office-box-address INTEGER ::= 18 PostOfficeBoxAddress ::= PDSParameter poste-restante-address INTEGER ::= 19 PosteRestanteAddress ::= PDSParameter unique-postal-name INTEGER ::= 20 UniquePostalName ::= PDSParameter local-postal-attributes INTEGER ::= 21 LocalPostalAttributes ::= PDSParameter PDSParameter ::= SET { printable-string PrintableString (SIZE(1..ub-pds-parameter-length)) OPTIONAL, teletex-string TeletexString (SIZE(1..ub-pds-parameter-length)) OPTIONAL } extended-network-address INTEGER ::= 22 ExtendedNetworkAddress ::= CHOICE { e163-4-address SEQUENCE { number [0] IMPLICIT NumericString (SIZE (1..ub-e163-4-number-length)), sub-address [1] IMPLICIT NumericString (SIZE (1..ub-e163-4-sub-address-length)) OPTIONAL }, psap-address [0] IMPLICIT PresentationAddress } PresentationAddress ::= SEQUENCE { pSelector [0] EXPLICIT OCTET STRING OPTIONAL, sSelector [1] EXPLICIT OCTET STRING OPTIONAL, tSelector [2] EXPLICIT OCTET STRING OPTIONAL, nAddresses [3] EXPLICIT SET SIZE (1..MAX) OF OCTET STRING } terminal-type INTEGER ::= 23 TerminalType ::= INTEGER { telex (3), teletex (4), g3-facsimile (5), g4-facsimile (6), ia5-terminal (7), videotex (8) } (0..ub-integer-options) -- Extension Domain-defined Attributes teletex-domain-defined-attributes INTEGER ::= 6 TeletexDomainDefinedAttributes ::= SEQUENCE SIZE (1..ub-domain-defined-attributes) OF TeletexDomainDefinedAttribute TeletexDomainDefinedAttribute ::= SEQUENCE { type TeletexString (SIZE (1..ub-domain-defined-attribute-type-length)), value TeletexString (SIZE (1..ub-domain-defined-attribute-value-length)) } -- specifications of Upper Bounds MUST be regarded as mandatory -- from Annex B of ITU-T X.411 Reference Definition of MTS Parameter -- Upper Bounds -- Upper Bounds ub-name INTEGER ::= 32768 ub-common-name INTEGER ::= 64 ub-locality-name INTEGER ::= 128 ub-state-name INTEGER ::= 128 ub-organization-name INTEGER ::= 64 ub-organizational-unit-name INTEGER ::= 64 ub-title INTEGER ::= 64 ub-serial-number INTEGER ::= 64 ub-match INTEGER ::= 128 ub-emailaddress-length INTEGER ::= 255 ub-common-name-length INTEGER ::= 64 ub-country-name-alpha-length INTEGER ::= 2 ub-country-name-numeric-length INTEGER ::= 3 ub-domain-defined-attributes INTEGER ::= 4 ub-domain-defined-attribute-type-length INTEGER ::= 8 ub-domain-defined-attribute-value-length INTEGER ::= 128 ub-domain-name-length INTEGER ::= 16 ub-extension-attributes INTEGER ::= 256 ub-e163-4-number-length INTEGER ::= 15 ub-e163-4-sub-address-length INTEGER ::= 40 ub-generation-qualifier-length INTEGER ::= 3 ub-given-name-length INTEGER ::= 16 ub-initials-length INTEGER ::= 5 ub-integer-options INTEGER ::= 256 ub-numeric-user-id-length INTEGER ::= 32 ub-organization-name-length INTEGER ::= 64 ub-organizational-unit-name-length INTEGER ::= 32 ub-organizational-units INTEGER ::= 4 ub-pds-name-length INTEGER ::= 16 ub-pds-parameter-length INTEGER ::= 30 ub-pds-physical-address-lines INTEGER ::= 6 ub-postal-code-length INTEGER ::= 16 ub-pseudonym INTEGER ::= 128 ub-surname-length INTEGER ::= 40 ub-terminal-id-length INTEGER ::= 24 ub-unformatted-address-length INTEGER ::= 180 ub-x121-address-length INTEGER ::= 16 -- Note - upper bounds on string types, such as TeletexString, are -- measured in characters. Excepting PrintableString or IA5String, a -- significantly greater number of octets will be required to hold -- such a value. As a minimum, 16 octets, or twice the specified -- upper bound, whichever is the larger, should be allowed for -- TeletexString. For UTF8String or UniversalString at least four -- times the upper bound should be allowed. END
简化版定义 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 OPTIONAL -- parameters ,DSA(DSS)算法时的parameters,RSA算法没有此参数 } Name ::= SEQUENCE OF RelativeDistinguishedName RelativeDistinguishedName ::= SET OF AttributeTypeAndValue AttributeTypeAndValue ::= SEQUENCE { type OBJECT IDENTIFIER, value ANY } Validity ::= SEQUENCE { notBefore Time, -- 证书有效期起始时间 notAfter Time -- 证书有效期终止时间 } Time ::= CHOICE { utcTime UTCTime, generalTime GeneralizedTime } SubjectPublicKeyInfo ::= SEQUENCE { algorithm AlgorithmIdentifier, -- 公钥算法 subjectPublicKey BIT STRING -- 公钥值 } Extensions ::= SEQUENCE OF Extension Extension ::= SEQUENCE { extnID OBJECT IDENTIFIER, critical BOOLEAN DEFAULT FALSE, extnValue OCTET STRING } AlgorithmIdentifier ::= SEQUENCE { algorithm OBJECT IDENTIFIER, parameters ANY DEFINED BY algorithm OPTIONAL }
证书字段 X.509 证书标准有三个增量版本,每个后续版本都向标准添加了证书字段:
1988 年发布的版本 1 (v1),遵循证书的初始 X.509 标准。
1993 年发布的版本 2 (v2),向版本 1 中包含的字段添加了两个字段。
2008 年发布的版本 3 (v3),即 X.509 标准的当前版本。 此版本添加了对证书扩展名的支持。
版本 1 字段 下表描述了 X.509 证书的版本 1 证书字段。 此表中包含的所有字段都存在于后续的 X.509 证书版本中。
展开表
名称
字段名称
说明
版本
version
标识证书版本号的整数。
序列号
serialNumber
一个整数,表示证书颁发机构 (CA) 颁发的每个证书的唯一编号。
Signature
signature
CA 用来签署证书的加密算法的标识符。 该值包括算法的标识符和该算法使用的任何可选参数(如果适用)。
颁发者
issuer
发证 CA 的证书的可分辨名称 (DN)。
有效期
validity
证书有效的非独占时间段。
主题
Subject
证书使用者的可分辨名称 (DN)。
使用者公钥信息
Subject Public Key Info
证书使用者拥有的公钥。
版本 2 字段 下表描述了为版本 2 添加的字段,其中包含有关证书颁发者的信息。 不过,这些字段很少使用。 此表中包含的所有字段都存在于后续的 X.509 证书版本中。
展开表
名称
字段名称
说明
颁发者唯一 ID
Unique Identifiers
表示发证 CA 的唯一标识符,由发证 CA 定义。
使用者唯一 ID
Unique Identifiers
辨识证书使用者的唯一标识符,由发证 CA 定义。
这些字段必须仅在版本为2或3时出现(第4.1.2.1节 )。如果版本为1,则这些字段不得出现。证书中存在主体和颁发者唯一标识符,以处理随着时间的推移重复使用主体和/或颁发者名称的可能性。此配置文件建议不要将名称重复用于不同的实体,并且Internet证书不要使用唯一标识符。符合此配置文件的CA不得生成具有唯一标识符的证书。符合此配置文件的应用程序应该能够解析包含唯一标识符的证书,但并没有与唯一标识符相关的处理要求。
版本 3 字段 下表描述了为版本 3 添加的字段,它表示 X.509 证书扩展名的集合。
展开表
名称
说明
扩展
标准和 Internet 特定证书扩展名的集合。 有关可用于 X.509 v3 证书的证书扩展名的详细信息,请参阅证书扩展名 。
证书扩展名 版本 3 中引入的证书扩展名提供了将更多属性与用户或公钥关联的方法,以及管理证书颁发机构之间的关系的方法。 有关证书扩展名的详细信息,请参阅 RFC 5280 规范的证书扩展名 部分。
标准扩展名 X.509 标准定义了本节中包含的用于 Internet 公钥基础结构 (PKI) 的扩展名。
名称
字段名称
OBJECT_IDENTIFIER
说明
授权密钥标识符
Authority Key Identifier
2.5.29.35 authorityKeyIdentifier
一个标识符,表示证书使用者和颁发此证书的 CA 证书的序列号,或发证 CA 的公钥的哈希。
使用者密钥标识符
Subject Key Identifier
2.5.29.14 subjectKeyIdentifier
当前证书公钥的哈希。
密钥使用情况
Key Usage
2.5.29.15 keyUsage
一个位图值,用于定义可以使用证书的服务。
私钥使用周期
密钥对的私钥部分的有效期。
证书策略
certificatePolicies
2.5.29.32 certificatePolicies
策略信息的集合,用于验证证书使用者。
策略映射
Certificate Policies
2.5.29.33
策略映射的集合,其中每个映射都将一个组织中的策略映射到另一个组织中的策略。
使用者可选名称
Subject Alternative Name
2.5.29.17 subjectAltName
主题的备用名称集合。
颁发者备用名称
Issuer Alternative Name
2.5.29.18
发证 CA 的备用名称集合。
使用目录属性
Subject Directory Attributes
2.5.29.9
X.500 或 LDAP 目录中的属性集合。
基本约束
basicConstraints
2.5.29.19 basicConstraints
允许证书指定是将其颁发给 CA,还是用户、计算机、设备或服务的约束集合。 此扩展还包括一个路径长度约束,用于限制可以存在的从属 CA 的数量。
名称约束
Name Constraints
2.5.29.30 nameConstraints
约束集合,用于指定 CA 颁发的证书中允许哪些命名空间。
策略约束
Policy Constraints
2.5.29.36
可用于禁止 CA 之间的策略映射的约束集合。
扩展密钥用法
Extended Key Usage
2.5.29.37 extKeyUsage
密钥用途值的集合,表示在“密钥用法 ”扩展中确定的用途之外可用如何使用证书的公钥。
CRL 分发点
CRL Distribution Points
2.5.29.31 cRLDistributionPoints
发布基本证书吊销列表 (CRL) 的 URL 集合。
禁止 anyPolicy
Inhibit anyPolicy
2.5.29.54
禁止在从属 CA 证书中使用“所有颁发策略 ”OID (2.5.29.32.0)
最新 CRL
Freshest CRL (a.k.a. Delta CRL Distribution Point)
2.5.29.46
此扩展(也称为 Delta CRL 分发点 )包含一个或多个发布发证 CA 的增量 CRL 的 URL。
Authority Key Identifier( 2.5.29.35 颁发机构密钥标识符) 又称 “颁发机构密钥标识符”
授权密钥标识符扩展提供了识别与用于签署证书的私钥相对应的公钥的方法。此扩展用于颁发者具有多个签名密钥(由于多个并发密钥对或由于转换)的情况。标识可以基于密钥标识符(颁发者证书中的主体密钥标识符)或颁发者名称和序列号。
authorityKeyIdentifier扩展的keyIdentifier字段必须包含在合格CA生成的所有证书中,以便于构建证书路径。有一个例外;如果CA以“自签名”证书的形式分发其公钥,则可以省略授权密钥标识符。自签名证书上的签名是使用与证书的主题公钥关联的私钥生成的。(这证明颁发者同时拥有公钥和私钥。)在这种情况下,主体密钥标识符和授权密钥标识符将是相同的,但构建认证路径只需要主体密钥标识符。
keyIdentifier字段的值应从用于验证证书签名或方法的公钥派生
这将生成唯一的值。第4.2.1.2节描述了从公钥生成密钥标识符的两种常用方法。在先前未建立密钥标识符的情况下,本规范建议使用这些方法之一来生成密钥标识符,或使用使用不同哈希算法的类似方法。如果先前已建立密钥标识符,CA应使用先前建立的标识符。
此配置文件建议所有证书用户支持密钥标识符方法。
合格CA必须将此扩展标记为非关键扩展。
对应的扩展OID值为 2.5.29.35
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
Subject Key Identifier (2.5.29.14 主体密钥标识符) 主题密钥标识符扩展提供了一种识别包含特定公钥的证书的方法。
为了促进认证路径的构建,该扩展必须出现在所有符合条件的CA证书中,即包括基本约束扩展(第4.2.1.9节)在内的所有证书中,其中CA的值为真。在一致性CA证书中,主体密钥标识符的值必须是由本证书主体颁发的证书的授权密钥标识符扩展(第4.2.1.1节)的密钥标识符字段中的值。执行认证路径验证时,应用程序无需验证密钥标识符是否匹配。
对于CA证书,主题密钥标识符应来自公钥或生成唯一值的方法。从公钥生成密钥标识符的两种常用方法是:
(1) keyIdentifier由位字符串subjectPublicKey值的160位SHA-1散列组成(不包括标记、长度和未使用位的数量)
(2) keyIdentifier由一个四位类型字段组成,该字段的值为0100,后跟位字符串subjectPublicKey值的SHA-1散列的最低有效60位(不包括标记、长度和未使用位的数量)。
生成唯一编号的其他方法也是可以接受的。
对于终端实体证书,主题密钥标识符扩展提供了一种方法,用于识别包含应用程序中使用的特定公钥的证书。当终端实体已经获得多个证书,特别是从多个CA获得多个证书时,主体密钥标识符提供了一种快速识别包含特定公钥的证书集的方法。为了帮助应用程序识别适当的终端实体证书,此扩展应包含在所有终端实体证书中。
对于终端实体证书,主题密钥标识符应该从公钥派生。上面识别了用于从公钥生成密钥标识符的两种常用方法。
在先前未建立密钥标识符的情况下,本规范建议使用这些方法之一来生成密钥标识符,或使用使用不同哈希算法的类似方法。如果先前已建立密钥标识符,CA应使用先前建立的标识符。
合格CA必须将此扩展标记为非关键扩展。
对应的扩展OID值为 2.5.29.14
id-ce-subjectKeyIdentifier OBJECT IDENTIFIER ::= { id-ce 14 } SubjectKeyIdentifier ::= KeyIdentifier
Key Usage(2.5.29.15 关键用法) 密钥使用扩展定义了证书中包含的密钥的用途(例如,加密、签名、证书签名)。当要限制可用于多个操作的密钥时,可以使用使用限制。例如,当RSA密钥仅用于验证公钥证书和CRL以外的对象上的签名时,将断言数字签名和/或不可否认位。同样,当RSA密钥仅用于密钥管理时,将断言密钥加密位。
合格CA必须在包含公钥的证书中包含此扩展,该公钥用于验证其他公钥证书或CRL上的数字签名。当存在时,合格CA应将该扩展标记为关键扩展。
对应的扩展OID值为 2.5.29.15
id-ce-keyUsage OBJECT IDENTIFIER ::= { id-ce 15 } KeyUsage ::= BIT STRING { digitalSignature (0), nonRepudiation (1), -- recent editions of X.509 have -- renamed this bit to contentCommitment keyEncipherment (2), dataEncipherment (3), keyAgreement (4), keyCertSign (5), cRLSign (6), encipherOnly (7), decipherOnly (8) }
KeyUsage类型中的位使用如下:
当主体公钥用于验证数字签名(证书上的签名(位5)和CRL(位6))以外的数字签名(如实体认证服务、数据源认证服务和/或完整性服务中使用的签名)时,数字签名位被断言。
当主体公钥用于验证数字签名(证书上的签名(位5)和CRL(位6)除外)时,非否认位被断言,该数字签名用于提供防止签名实体错误拒绝某些操作的非否认服务。在以后发生冲突的情况下,可靠的第三方可以确定签名数据的真实性。(请注意,X.509的最新版本已将不可否认性位重命名为ContentCommission。)
当主体公钥用于加密私钥或私钥(即用于密钥传输)时,密钥加密位被断言。例如,当RSA公钥用于加密对称内容解密密钥或非对称私钥时,应设置该位。
当主题公钥用于直接加密原始用户数据而不使用中间对称密码时,数据加密位被断言。请注意,该钻头的使用极为罕见;几乎所有应用程序都使用密钥传输或密钥协商来建立对称密钥。
当主题公钥用于密钥协商时,将断言密钥协商位。例如,当Diffie-Hellman密钥用于密钥管理时,设置该位。
当主题公钥用于验证公钥证书上的签名时,会断言keyCertSign位。如果断言keyCertSign位,则还必须断言基本约束扩展(第4.2.1.9节)中的cA位。
当主体公钥用于验证证书撤销列表(例如CRL、增量CRL或ARL)上的签名时,cRLSign位被断言。
在没有密钥协商位的情况下,仅加密位的含义未定义。当仅加密位被断言并且密钥协商位也被设置时,主体公钥可仅用于在执行密钥协商时对数据进行加密。
在没有密钥协商位的情况下,仅解密位的含义未定义。当仅解密位被断言并且密钥协商位也被设置时,主体公钥可仅用于在执行密钥协商时解密数据。
如果存在keyUsage扩展,则除非设置了相应的keyCertSign或cRLSign位,否则不得使用主题公钥验证证书或CRL上的签名。如果主题公钥仅用于验证证书和/或CRL上的签名,则不应设置数字签名和非否认位。然而,如果主体公钥将用于验证证书和/或CRL以及其他对象上的签名,则可以在keyCertSign和/或cRLSign位之外设置数字签名和/或非否认位。
根据要使用证书的上下文,将keyUsage证书扩展中的非否认位与其他keyUsage位组合可能具有安全含义。数字签名和非否认位之间的进一步区别可在特定证书策略中提供。
此配置文件不限制可在keyUsage扩展的实例化中设置的位的组合。但是,[RFC3279]、[RFC4055]和[RFC4491]中规定了特定算法的密钥使用扩展的适当值。当证书中出现keyUsage扩展时,必须将至少一个位设置为1。
Certificate Policies (2.5.29.32 证书策略) 证书策略扩展包含一个或多个策略信息术语序列,每个术语由对象标识符(OID)和可选限定符组成。可能存在的可选限定符预计不会更改策略的定义。证书策略OID在证书策略扩展中不能出现多次。
在终端实体证书中,这些策略信息术语表示颁发证书所依据的策略以及证书的用途。在CA证书中,这些策略信息术语限制了包含此证书的证书路径的策略集。当CA不希望限制包含此证书的证书路径的策略集时,它可以使用值{2 5 29 32 0}断言特殊策略anyPolicy。
具有特定策略要求的应用程序应具有其将接受的策略列表,并将证书中的策略OID与该列表进行比较。如果此扩展是关键的,则路径验证软件必须能够解释此扩展(包括可选限定符),或者必须拒绝证书。
为了促进互操作性,此概要文件建议策略信息术语只包含OID。如果单独使用OID是不够的,本概要文件强烈建议限定符的使用仅限于本节中确定的限定符。当限定符与特殊政策anyPolicy一起使用时,它们必须限于本节中确定的限定符。仅考虑作为路径验证结果返回的限定符。
本规范定义了两种策略限定符类型,供证书策略编写者和证书颁发者使用。限定符类型是CPS指针限定符和用户通知限定符。
CPS指针限定符包含指向CA发布的认证实践声明(CPS)的指针。该指针采用URI的形式。此限定符的处理要求是本地事务。无论为扩展断言的临界值如何,本规范均不强制执行任何操作。
用户通知旨在在使用证书时向依赖方显示。只有作为路径验证结果返回的用户通知才会显示给用户。如果通知是重复,只需显示一份副本。为防止此类重复,此限定符应仅出现在颁发给其他组织的最终实体证书和CA证书中。用户通知有两个可选字段:noticeRef字段和explicitText字段。符合条件的CA不应使用noticeRef选项。
noticeRef字段(如果使用)命名一个组织,并通过编号标识该组织准备的特定文本声明。例如,它可能会标识组织“CertsRUs”并通知编号1。在典型的实现中,应用软件将有一个通知文件,其中包含CertSRU的当前通知集;应用程序将从文件中提取通知文本并显示它。消息可以是多语言的,允许软件为自己的环境选择特定的语言消息。
explicitText字段直接在证书中包含文本语句。explicitText字段是最大大小为200个字符的字符串。一致性CA应使用UTF8String编码作为explicitText,但也可以使用IA5String。符合条件的CA不得将explicitText编码为VisibleString或BMPString。explicitText字符串不应包含任何控制字符(例如,U+0000到U+001F和U+007F到U+009F)。当使用UTF8String编码时,所有字符序列都应该根据Unicode规范化格式C(NFC)[NFC]进行规范化。
如果noticeRef和explicitText选项都包含在一个限定符中,并且如果应用软件可以找到noticeRef选项指示的通知文本,则应显示该文本;否则,应显示explicitText字符串。
注意:虽然explicitText的最大大小为200个字符,但一些不符合要求的CA超过了此限制。因此,证书用户应该优雅地处理超过200个字符的explicitText。
id-ce-certificatePolicies OBJECT IDENTIFIER ::= { id-ce 32 } anyPolicy OBJECT IDENTIFIER ::= { id-ce-certificatePolicies 0 } certificatePolicies ::= SEQUENCE SIZE (1..MAX) OF PolicyInformation PolicyInformation ::= SEQUENCE { policyIdentifier CertPolicyId, policyQualifiers SEQUENCE SIZE (1..MAX) OF PolicyQualifierInfo OPTIONAL } CertPolicyId ::= OBJECT IDENTIFIER PolicyQualifierInfo ::= SEQUENCE { policyQualifierId PolicyQualifierId, qualifier ANY DEFINED BY policyQualifierId } -- policyQualifierIds for Internet policy qualifiers id-qt OBJECT IDENTIFIER ::= { id-pkix 2 } id-qt-cps OBJECT IDENTIFIER ::= { id-qt 1 } id-qt-unotice OBJECT IDENTIFIER ::= { id-qt 2 } PolicyQualifierId ::= OBJECT IDENTIFIER ( id-qt-cps | id-qt-unotice ) Qualifier ::= CHOICE { cPSuri CPSuri, userNotice UserNotice } CPSuri ::= IA5String UserNotice ::= SEQUENCE { noticeRef NoticeReference OPTIONAL, explicitText DisplayText OPTIONAL } NoticeReference ::= SEQUENCE { organization DisplayText, noticeNumbers SEQUENCE OF INTEGER } DisplayText ::= CHOICE { ia5String IA5String (SIZE (1..200)), visibleString VisibleString (SIZE (1..200)), bmpString BMPString (SIZE (1..200)), utf8String UTF8String (SIZE (1..200)) }
Subject Alternative Name (2.5.29.17 主题替代名称) subject alternative name扩展允许将身份绑定到证书的主题。这些身份可以包括在证书主题字段中的身份之外或代替该身份。定义的选项包括Internet电子邮件地址、DNS名称、IP地址和统一资源标识符(URI)。还有其他选项,包括完全本地定义。可以包括多个姓名表以及每个姓名表的多个实例。每当此类身份被绑定到证书中时,必须使用主体替代名称(或发行人替代名称)扩展名;但是,DNS名称也可以使用第4.1.2.4节所述的domainComponent属性在主题字段中表示。请注意,如果在主题字段中表示这些名称,则不需要将它们转换为DNS名称。
因为主体替代名称被认为是与公钥的最终绑定,所以主体替代名称的所有部分都必须由CA进行验证。
此外,如果证书中包含的唯一受试者身份是替代名称形式(例如电子邮件地址),则受试者可分辨名称必须为空(空序列),并且必须存在受试者名称扩展名。如果subject字段包含空序列,则发出CA必须包含标记为critical的subjectAltName扩展名。当在具有非空主题可分辨名称的证书中包含subjectAltName扩展名时,符合条件的CA应将subjectAltName扩展名标记为非关键。
当subjectAltName扩展名包含Internet邮件地址时,该地址必须存储在RFC822名称中。RFC822名称的格式为[RFC2821]第4.1.2节中定义的“邮箱”。邮箱的格式为“本地”-part@Domain”. 请注意,邮箱前面没有短语(如通用名称),后面没有注释(括号中包含的文本),并且没有被“<”和“>”包围。第7.5节规定了对包含国际化域名的互联网邮件地址进行编码的规则。
当subjectAltName扩展名包含iPAddress时,地址必须按照[RFC791]中的规定以“网络字节顺序”存储在八位字节字符串中。每个八位字节的最低有效位(LSB)是网络地址中相应字节的LSB。对于IP版本4,如[RFC791]中所述,八位字节字符串必须正好包含四个八位字节。对于IP版本6,如[RFC2460]中所述,八位字节字符串必须正好包含十六个八位字节。
当subjectAltName扩展名包含域名系统标签时,域名必须存储在dNSName(IA5String)中。按照[RFC1034]第3.5节的规定和[RFC1123]第2.1节的修改,名称必须采用“首选名称语法”。请注意,虽然域名中允许使用大小写字母,但大小写没有任何意义。
此外,虽然字符串“”是合法域名,但不得使用dNSName为“”的subjectAltName扩展名。最后,对Internet邮件地址使用DNS表示(subscriber.example.com而不是subscriber@example.com)不得使用;此类标识将被编码为rfc822Name。第7.2节规定了国际化域名的编码规则。
当subjectAltName扩展名包含URI时,该名称必须存储在uniformResourceIdentifier(IA5String)中。名称不能是相对URI,并且必须遵循[RFC3986]中指定的URI语法和编码规则。名称必须包括方案(例如“http”或“ftp”)和特定于方案的部分。包含授权的URI([RFC3986],第3.2节)必须包含完全限定的域名或IP地址作为主机。第7.4节规定了国际化资源标识符(IRI)的编码规则。
如[RFC3986]所述,方案名称不区分大小写(例如,“http”相当于“http”)。主机部分(如果存在)也不区分大小写,但方案特定部分的其他组件可能区分大小写。第7.4节规定了比较URI的规则。
当subjectAltName扩展名在directoryName中包含DN时,编码规则与第4.1.2.4节中为issuer字段指定的编码规则相同。对于每个主体实体,DN必须是唯一的,由发卡机构字段定义的一个CA认证。CA可以向同一主体实体颁发多个具有相同DN的证书。
subjectAltName可以通过使用otherName字段携带其他名称类型。名称的格式和语义通过type id字段中的对象标识符指示。名称本身在otherName中作为值字段传递。例如,Kerberos[RFC4120]格式名称可以使用Kerberos 5主体名称OID以及领域和主体名称序列编码为otherName。
可使用第4.2.1.10节所述的名称约束扩展,以与受试者可分辨名称相同的方式约束受试者备选名称。
如果存在subjectAltName扩展名,则序列必须至少包含一个条目。与subject字段不同,一致性CA不得颁发SubjectAltName包含空GeneralName字段的证书。例如,RFC822名称表示为IA5String。虽然空字符串是有效的IA5String,但此配置文件不允许使用此类RFC822名称。
最后,包含通配符(例如,作为一组名称的占位符)的主题备选名称的语义不在本规范中讨论。具有特定需求的应用程序可以使用此类名称,但它们必须定义语义。
id-ce-subjectAltName OBJECT IDENTIFIER ::= { id-ce 17 } SubjectAltName ::= GeneralNames GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName GeneralName ::= CHOICE { otherName [0] OtherName, rfc822Name [1] IA5String, dNSName [2] IA5String, x400Address [3] ORAddress, directoryName [4] Name, ediPartyName [5] EDIPartyName, uniformResourceIdentifier [6] IA5String, iPAddress [7] OCTET STRING, registeredID [8] OBJECT IDENTIFIER } OtherName ::= SEQUENCE { type-id OBJECT IDENTIFIER, value [0] EXPLICIT ANY DEFINED BY type-id } EDIPartyName ::= SEQUENCE { nameAssigner [0] DirectoryString OPTIONAL, partyName [1] DirectoryString }
Issuer Alternative Name (2.5.29.18 发行人备选名称) 与第4.2.1.6节一样,此扩展用于将Internet样式标识与证书颁发者关联。发卡机构备选名称必须按照4.2.1.6进行编码。发卡机构备选名称不作为第6节中认证路径验证算法的一部分进行处理。(也就是说,名称链接中不使用发卡机构备选名称,也不强制实施名称约束。)
如果存在,合格CA应将该扩展标记为非关键扩展。
id-ce-issuerAltName OBJECT IDENTIFIER ::= { id-ce 18 } IssuerAltName ::= GeneralNames
Basic Constraints (2.5.29.19 基本约束条件) 基本约束扩展标识证书的主题是否为CA以及包含此证书的有效证书路径的最大深度。
cA布尔值指示经认证的公钥是否可用于验证证书签名。如果未断言cA布尔值,则不得断言密钥使用扩展中的keyCertSign位。如果版本3证书中不存在基本约束扩展,或者存在扩展但未断言cA布尔值,则不得使用经认证的公钥验证证书签名。
pathLenConstraint字段只有在cA布尔值被断言且密钥使用扩展(如果存在)断言keyCertSign位时才有意义(第4.2.1.3节)。在这种情况下,它给出了在有效的证书路径中该证书之后可能出现的非自颁发中间证书的最大数量。(注意:证书路径中的最后一个证书不是中间证书,不包括在此限制中。通常,最后一个证书是终端实体证书,但可以是CA证书。)pathLenConstraint为零表示有效的证书路径中不能有非自颁发的中间CA证书。出现时,pathLenConstraint字段必须大于或等于零。如果未出现pathLenConstraint,则不会施加任何限制。
合格CA必须在所有CA证书中包含此扩展,这些CA证书包含用于验证证书上数字签名的公钥,并且必须在此类证书中将扩展标记为关键。此扩展可能在CA证书中显示为关键或非关键扩展,CA证书中包含的公钥仅用于验证证书上的数字签名以外的目的。此类CA证书包括包含专用于验证CRL上数字签名的公钥的证书和包含与证书一起使用的密钥管理公钥的证书
注册协议。此扩展可能在最终实体证书中显示为关键或非关键扩展。
cA不得包含pathLenConstraint字段,除非cA布尔值被断言,并且密钥使用扩展断言keyCertSign位。
id-ce-basicConstraints OBJECT IDENTIFIER ::= { id-ce 19 } BasicConstraints ::= SEQUENCE { cA BOOLEAN DEFAULT FALSE, pathLenConstraint INTEGER (0..MAX) OPTIONAL }
Name Constraints (2.5.29.30 名称约束) 名称约束扩展只能在CA证书中使用,它指示一个名称空间,证书路径中后续证书中的所有使用者名称都必须位于该名称空间中。限制适用于受试者可分辨名称和受试者备选名称。仅当指定的名称表单存在时,限制才适用。如果证书中没有类型名称,则该证书是可接受的。
名称约束不应用于自颁发的证书(除非该证书是路径中的最终证书)。(这可能会阻止使用名称约束的CA使用自颁发的证书来实现密钥翻转。)
限制是根据允许或排除的名称子树定义的。任何与excludedSubtrees字段中的限制匹配的名称都无效,无论permittedSubtrees中显示的信息如何。符合条件的CA必须将此扩展标记为关键扩展,并且不应对X400地址、ePartyName或registeredID名称表单施加名称约束。当名称约束为空序列时,符合条件的CA不得颁发证书。也就是说,permittedSubtrees字段或excludedSubtrees必须存在。
符合此配置文件的应用程序必须能够处理强加于directoryName名称表单的名称约束,并且应该能够处理强加于rfc822Name、uniformResourceIdentifier、dNSName和iPAddress名称表单的名称约束。如果标记为关键的名称约束扩展对特定名称表单施加约束,并且该名称表单的实例出现在后续证书的subject字段或subjectAltName扩展中,则应用程序必须处理该约束或拒绝该证书。
在此配置文件中,最小和最大字段不与任何名称表单一起使用,因此,最小值必须为零,而最大值必须不存在。但是,如果应用程序遇到为后续证书中出现的名称表单的最小值或最大值指定其他值的关键名称约束扩展,则应用程序必须处理这些字段或拒绝证书。
对于URI,约束将应用于名称的主机部分。必须将约束指定为完全限定的域名,并可以指定主机或域。例如“host.example.com”和“.example.com”。当约束以句点开始时,可以使用一个或多个标签展开。也就是说,host.example.com和my.host.example.com都满足约束“.example.com”。但是,“example.com”不满足约束“.example.com”。当约束不以句点开头时,它将指定一个主体。如果将约束应用于uniformResourceIdentifier名称表单,且后续证书包含subjectAltName扩展,且uniformResourceIdentifier不包含主机名指定为完全限定域名的授权组件(例如,如果URI不包含授权组件或包含主机名指定为IP地址的授权组件),则应用程序必须拒绝证书。
Internet邮件地址的名称约束可以指定特定邮箱、特定主机上的所有地址或域中的所有邮箱。要指示特定邮箱,约束条件是完整的邮件地址。例如,”root@example.com表示主机“example.com”上的根邮箱。要指示特定主机上的所有Internet邮件地址,将约束指定为主机名。例如,主机“example.com”上的任何邮件地址都满足约束“example.com”。若要指定域中的任何地址,将使用前导句点指定约束(与URI一样)。例如,“.example.com”表示域“example.com”中的所有Internet邮件地址,但不表示主机“example.com”上的Internet邮件地址。
DNS名称限制表示为host.example.com。只要在名称的左侧添加零个或多个标签即可构造的任何DNS名称都满足名称约束。例如,www.host.example.com将满足约束,但host1.example.com将不满足约束。
旧式实现中,电子邮件地址嵌入在emailAddress类型属性的主题可分辨名称中(第4.1.2.6节)。当约束被施加到
rfc822Name名称表单,但证书不包括使用者备选名称,rfc822Name约束必须应用于使用者可分辨名称中emailAddress类型的属性。附录A中提供了emailAddress的ASN.1语法和相应的OID。
directoryName格式的限制必须应用于证书中的subject字段(当证书包含非空的subject字段时)和subjectAltName扩展名中directoryName类型的任何名称。x400Address格式的限制必须应用于subjectAltName扩展名中x400Address类型的任何名称。
应用directoryName表单的限制时,实现必须比较DN属性。实现至少必须执行第7.1节中指定的DN比较规则。CA颁发具有directoryName格式限制的证书不应依赖于完整ISO DN名称比较算法的实现。这意味着名称限制必须与subject字段或subjectAltName扩展中使用的编码相同。
iPAddress的语法必须如第4.2.1.6节所述,并特别针对名称限制添加以下内容。对于IPv4地址,GeneralName的iPAddress字段必须包含八(8)个八位字节,以RFC 4632(CIDR)的样式编码以表示地址范围[RFC4632]。对于IPv6地址,iPAddress字段必须包含32个编码类似的八位字节。例如,“C类”子网192.0.2.0的名称约束表示为八位字节C000 02 00 FF 00,表示CIDR符号192.0.2.0/24(掩码255.255.255.0)。
本规范未定义otherName、ePartyName和registeredID的名称约束的语法和语义,但是,其他文档中可能会指定其他名称形式的名称约束的语法和语义。
id-ce-nameConstraints OBJECT IDENTIFIER ::= { id-ce 30 } NameConstraints ::= SEQUENCE { permittedSubtrees [0] GeneralSubtrees OPTIONAL, excludedSubtrees [1] GeneralSubtrees OPTIONAL } GeneralSubtrees ::= SEQUENCE SIZE (1..MAX) OF GeneralSubtree GeneralSubtree ::= SEQUENCE { base GeneralName, minimum [0] BaseDistance DEFAULT 0, maximum [1] BaseDistance OPTIONAL } BaseDistance ::= INTEGER (0..MAX)
Extended Key Usage (2.5.29.37 扩展密钥使用) 除了密钥使用扩展中指示的基本用途之外,此扩展还指示认证公钥可用于的一个或多个用途。通常,此扩展仅出现在最终实体证书中。该扩展定义如下:
id-ce-extKeyUsage OBJECT IDENTIFIER ::= { id-ce 37 } ExtKeyUsageSyntax ::= SEQUENCE SIZE (1..MAX) OF KeyPurposeId KeyPurposeId ::= OBJECT IDENTIFIER
关键目的可由任何有需要的组织确定。用于识别关键用途的对象标识符必须按照IANA或ITU-T建议X.660[X.660]进行分配。
根据证书颁发者的选择,此扩展可以是关键的,也可以是非关键的。
如果存在扩展,则证书只能用于指定的目的之一。如果指示了多个目的,则只要存在预期目的,应用程序就不需要识别所指示的所有目的。使用证书的应用程序可能要求存在扩展密钥使用扩展,并指明特定用途,以便该应用程序可以接受证书。
如果CA包括扩展密钥用法以满足此类应用,但不希望限制密钥的用法,则除了应用所需的特定密钥用途之外,CA还可以包括特殊的KeyPurposeId anyExtendedKeyUsage。如果存在anyExtendedKeyUsage KeyPurposeId,则符合条件的CA不应将此扩展标记为关键。需要存在特定用途的应用程序可能会拒绝包含anyExtendedKeyUsage OID但不包含应用程序预期的特定OID的证书。
如果证书同时包含密钥使用扩展和扩展密钥使用扩展,则必须独立处理这两个扩展,并且证书只能用于与这两个扩展一致的目的。如果没有与两个扩展一致的目的,则证书不得用于任何目的。
定义了以下主要用途:
anyExtendedKeyUsage OBJECT IDENTIFIER ::= { id-ce-extKeyUsage 0 } id-kp OBJECT IDENTIFIER ::= { id-pkix 3 } id-kp-serverAuth OBJECT IDENTIFIER ::= { id-kp 1 } -- TLS WWW server authentication -- Key usage bits that may be consistent: digitalSignature, -- keyEncipherment or keyAgreement id-kp-clientAuth OBJECT IDENTIFIER ::= { id-kp 2 } -- TLS WWW client authentication -- Key usage bits that may be consistent: digitalSignature -- and/or keyAgreement id-kp-codeSigning OBJECT IDENTIFIER ::= { id-kp 3 } -- Signing of downloadable executable code -- Key usage bits that may be consistent: digitalSignature id-kp-emailProtection OBJECT IDENTIFIER ::= { id-kp 4 } -- Email protection -- Key usage bits that may be consistent: digitalSignature, -- nonRepudiation, and/or (keyEncipherment or keyAgreement) id-kp-timeStamping OBJECT IDENTIFIER ::= { id-kp 8 } -- Binding the hash of an object to a time -- Key usage bits that may be consistent: digitalSignature -- and/or nonRepudiation id-kp-OCSPSigning OBJECT IDENTIFIER ::= { id-kp 9 } -- Signing OCSP responses -- Key usage bits that may be consistent: digitalSignature -- and/or nonRepudiation
常见的两种用法
1.3.6.1.5.5.7.3.2 clientAuth PKIX key purpose
和
1.3.6.1.5.5.7.3.1 serverAuth PKIX key purpose
CRL Distribution Points (2.5.29.31 CRL 分发点) CRL分发点扩展标识如何获取CRL信息。扩展应该是非关键的,但此概要文件建议CAs和应用程序支持此扩展。关于CRL管理的进一步讨论见第5节。
cRLDistributionPoints扩展是一个DistributionPoint序列。DistributionPoint由三个字段组成,每个字段都是可选的:DistributionPoint、Reasions和cRLIssuer。虽然这些字段中的每一个都是可选的,但分发点不能仅包含原因字段;distributionPoint或cRLIssuer必须存在。如果证书颁发者不是CRL颁发者,则CRL颁发者字段必须存在并包含CRL颁发者的名称。如果证书颁发者也是CRL颁发者,则符合条件的CA必须省略cRLIssuer字段,并且必须包括distributionPoint字段。
当存在distributionPoint字段时,它包含常规名称序列或单个值nameRelativeToCRLIssuer。如果DistributionPointName包含多个值,则每个名称都描述了获取相同CRL的不同机制。例如,同一个CRL可以通过LDAP和HTTP进行检索。
如果distributionPoint字段包含directoryName,则该directoryName的条目将包含当前CRL(出于相关原因),并且CRL由相关cRLIssuer发出。CRL可以存储在CertificateRelationList或AuthorityRecovationList属性中。应用程序将从本地配置的任何目录服务器获取CRL。应用程序用于访问目录的协议(如DAP或LDAP)是本地事务。
如果DistributionPointName包含URI类型的通用名称,则必须假定以下语义:URI是指向当前CRL的指针,其原因与相关联,并将由相关cRLIssuer发出。使用HTTP或FTP URI方案时,URI必须指向[RFC2585]中指定的单个DER编码的CRL。通过URI访问的HTTP服务器实现应在响应的内容类型标头字段中指定媒体类型application/pkix crl。使用LDAP URI方案[RFC4516]时,URI必须包含一个字段,该字段包含保存CRL的条目的可分辨名称,必须包含一个,该字段包含保存CRL的属性的适当属性描述[RFC4523],并且应该包含一个(例如:ldap://ldap.example.com/cn=example%20CA,dc=example,dc=com?certificaterejournalist;binary )。省略(例如ldap:///cn=CA,dc=example,dc=com?authorityRevocationList;binary )具有依赖于客户端可能必须联系适当服务器的任何先验知识的效果。如果存在,DistributionPointName应至少包括一个LDAP或HTTP URI。
如果DistributionPointName包含单个值nameRelativeToCRLIssuer,则该值提供可分辨名称碎片片段附加到CRL颁发者的X.500可分辨名称后,以获得分发点名称。如果DistributionPoint中存在cRLIssuer字段,则名称片段将附加到其包含的可分辨名称中;否则,名称片段将附加到证书颁发者的可分辨名称。一致性CA不应使用nameRelativeToCRLIssuer来指定分发点名称。当cRLIssuer包含多个可分辨名称时,DistributionPointName不得使用nameRelativeToCRLIssuer替代项。
如果DistributionPoint忽略了“原因”字段,则CRL必须包含所有原因的吊销信息。此配置文件建议不要按原因代码划分CRL。当合格CA在证书中包含cRLDistributionPoints扩展时,它必须至少包含一个分发点,该分发点指向基于各种原因覆盖该证书的CRL。
cRLIssuer识别签署和发布CRL的实体。如果存在,cRLIssuer必须仅包含分发点所指向的CRL的issuer字段中的可分辨名称(DN)。cRLIssuer字段中的名称编码必须与CRL的issuer字段中的编码完全相同。如果包含cRLIssuer字段,且该字段中的DN与CRL所在的X.500或LDAP目录条目不对应,则符合条件的CA必须包含distributionPoint字段。
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] RelativeDistinguishedName } ReasonFlags ::= BIT STRING { unused (0), keyCompromise (1), cACompromise (2), affiliationChanged (3), superseded (4), cessationOfOperation (5), certificateHold (6), privilegeWithdrawn (7), aACompromise (8) }
专用 Internet 扩展名 本节中包含的扩展名类似于标准扩展名,可用于将应用程序定向到有关发证 CA 或证书主体的在线信息。
名称
字段名称
OBJECT_IDENTIFIER
说明
颁发机构信息访问
Authority Information Access
1.3.6.1.5.5.7.1.1 authorityInfoAccess PKIX private extension
描述发证 CA 提供的其他信息的格式和位置的条目集合。
使用者信息访问
Subject Information Access
1.3.6.1.5.5.7.48.2 caIssuers PKIX subject/authority info access descriptor
描述证书使用者提供的其他信息的格式和位置的条目集合。
证书格式 可采用多种格式保存证书。 Azure IoT 中心身份验证通常使用隐私增强邮件 (PEM) 和个人信息交换 (PFX) 格式。 下表描述了用于表示证书的常用文件和格式。
格式
说明
二进制证书
使用可辨别编码规则 (DER) ASN.1 编码的原始格式二进制证书。
ASCII PEM 格式
PEM 证书 (.pem) 文件包含以 -----BEGIN CERTIFICATE----- 开头且以 -----END CERTIFICATE----- 结尾的 Base64 编码证书。 上传某些证书时(如设备证书),IoT 中心需要 PEM 格式(X.509 证书最常见的格式之一)。
ASCII PEM 密钥
包含 Base64 编码的 DER 密钥,可以选择包含有关用于密码保护的算法的其他元数据。
PKCS #7 证书
一种用于传输已签名或已加密数据的格式。 它可以包括整个证书链。 RFC 2315 定义此格式。
PKCS #8 密钥
私钥存储的格式。 RFC 5208 定义此格式。
PKCS #12 密钥和证书
一种复杂的格式,可以存储和保护密钥和整个证书链。 它通常与 .p12 或 .pfx 扩展名一起使用。 PKCS #12 等同于 PFX 格式。 RFC 7292 定义此格式。
自签名证书 出于测试目的,可以使用两个自签名证书在 IoT 中心对设备进行身份验证。 这种类型的身份验证有时称为指纹身份验证 ,因为证书由称为指纹 或拇指纹 的计算哈希值进行标识。 IoT 中心使用这些计算的哈希值对设备进行身份验证。
创建自签名证书
可以使用 OpenSSL 来创建自签名证书。 以下步骤演示如何在 bash shell 中运行 OpenSSL 命令,以创建自签名证书并检索可用于在 IoT 中心对设备进行身份验证的证书指纹。
运行以下命令以生成私钥并创建 PEM 编码的私钥 (.key) 文件,将以下占位符替换为相应的值。 以下命令生成的私钥使用具有 2048 位加密的 RSA 算法。
{KeyFile}。 私钥文件的名称。
openssl genpkey -out {KeyFile} -algorithm RSA -pkeyopt rsa_keygen_bits:2048
运行以下命令以生成 PKCS #10 证书签名请求 (CSR) 并创建 CSR (.csr) 文件,将以下占位符替换为相应的值。 在出现提示时,确保为自签名证书指定 IoT 设备的设备 ID。
{KeyFile}: 私钥文件的名称。
{CsrFile}: CSR 文件的名称。
{DeviceID}: IoT 设备的名称。
openssl req -new -key {KeyFile} -out {CsrFile} Country Name (2 letter code) [XX]:. State or Province Name (full name) []:. Locality Name (eg, city) [Default City]:. Organization Name (eg, company) [Default Company Ltd]:. Organizational Unit Name (eg, section) []:. Common Name (eg, your name or your server hostname) []:{DeviceID} Email Address []:. Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:. An optional company name []:.
运行以下命令以检查并验证你的 CSR,将以下占位符替换为相应的值。
{CsrFile}: 证书文件的名称。
openssl req -text -in {CsrFile} -verify -noout
运行以下命令以生成自签名证书并创建 PEM 编码的证书 (.crt) 文件,将以下占位符替换为相应的值。 该命令使用你的私钥转换 CSR 并为其签名,从而生成 365 天后过期的自签名证书。
{KeyFile}: 私钥文件的名称。
{CsrFile}: CSR 文件的名称。
{CrtFile}:证书文件的名称。
openssl x509 -req -days 365 -in {CsrFile} -signkey {KeyFile} -out {CrtFile}
运行以下命令以检索证书的指纹,将以下占位符替换为相应的值。 证书的指纹是该证书唯一的计算哈希值。 需要指纹才能在 IoT 中心配置 IoT 设备以进行测试。
{CrtFile}: 证书文件的名称。
openssl x509 -in {CrtFile} -noout -fingerprint
使用示例 有三个证书:ci_cert.pem 、eum_cert.pem 、euicc_cert.pem 。其中ci_cert.pem为CA证书,签发关系为:eum_cert.pem由ci_cert.pem签发、euicc_cert.pem由eum_cert.pem签发。
证书链数据 ci_cert.pem 证书 内容如下:
-----BEGIN CERTIFICATE----- MIICTDCCAfGgAwIBAgIBATAKBggqhkjOPQQDAjBJMRUwEwYDVQQDDAxHU01BIFRl c3QgQ0kxETAPBgNVBAsMCFRFU1RDRVJUMRAwDgYDVQQKDAdSU1BURVNUMQswCQYD VQQGEwJJVDAeFw0xODAzMjAxMDQwMjJaFw0xOTAzMjAxMDQwMjJaMEkxFTATBgNV BAMMDEdTTUEgVGVzdCBDSTERMA8GA1UECwwIVEVTVENFUlQxEDAOBgNVBAoMB1JT UFRFU1QxCzAJBgNVBAYTAklUMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEA/PB 6uvmm6S81GX7+3TAgku+4mjU+YqaeONdVFFoc4PnCvtGXstiXwq3qXT/yy3JeDo9 dp58nVQdQz1AfEVUsaOByTCBxjAdBgNVHQ4EFgQUAMOLTWNfZq1jcHrDNOWGqckM IgAwDwYDVR0TAQH/BAUwAwEB/zAXBgNVHSABAf8EDTALMAkGB2eBEgECAQAwDgYD VR0PAQH/BAQDAgEGMA4GA1UdEQQHMAWIA4g3ATBbBgNVHR8EVDBSMCegJaAjhiFo dHRwOi8vY2kudGVzdC5nc21hLmNvbS9DUkwtQS5jcmwwJ6AloCOGIWh0dHA6Ly9j aS50ZXN0LmdzbWEuY29tL0NSTC1CLmNybDAKBggqhkjOPQQDAgNJADBGAiEA49aD cyVvfVGH+1ezy0gT10M/oMgYStBXZjs62HG2dD0CIQCprPpRh8qwNl4toPVr159G GT+il8g1UqapmvFJb/jOsg== -----END CERTIFICATE-----
执行openssl x509 -in ci_cert.pem -text -noout得到如下信息:
λ openssl x509 -in ci_cert.pem -text -noout Certificate: Data: Version: 3 (0x2) Serial Number: 1 (0x1) Signature Algorithm: ecdsa-with-SHA256 Issuer: CN=GSMA Test CI, OU=TESTCERT, O=RSPTEST, C=IT Validity Not Before: Mar 20 10:40:22 2018 GMT Not After : Mar 20 10:40:22 2019 GMT Subject: CN=GSMA Test CI, OU=TESTCERT, O=RSPTEST, C=IT Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) pub: 04:03:f3:c1:ea:eb:e6:9b:a4:bc:d4:65:fb:fb:74: c0:82:4b:be:e2:68:d4:f9:8a:9a:78:e3:5d:54:51: 68:73:83:e7:0a:fb:46:5e:cb:62:5f:0a:b7:a9:74: ff:cb:2d:c9:78:3a:3d:76:9e:7c:9d:54:1d:43:3d: 40:7c:45:54:b1 ASN1 OID: prime256v1 NIST CURVE: P-256 X509v3 extensions: X509v3 Subject Key Identifier: 00:C3:8B:4D:63:5F:66:AD:63:70:7A:C3:34:E5:86:A9:C9:0C:22:00 X509v3 Basic Constraints: critical CA:TRUE X509v3 Certificate Policies: critical Policy: 2.23.146.1.2.1.0 X509v3 Key Usage: critical Certificate Sign, CRL Sign X509v3 Subject Alternative Name: Registered ID:2.999.1 X509v3 CRL Distribution Points: Full Name: URI:http://ci.test.gsma.com/CRL-A.crl Full Name: URI:http://ci.test.gsma.com/CRL-B.crl Signature Algorithm: ecdsa-with-SHA256 Signature Value: 30:46:02:21:00:e3:d6:83:73:25:6f:7d:51:87:fb:57:b3:cb: 48:13:d7:43:3f:a0:c8:18:4a:d0:57:66:3b:3a:d8:71:b6:74: 3d:02:21:00:a9:ac:fa:51:87:ca:b0:36:5e:2d:a0:f5:6b:d7: 9f:46:19:3f:a2:97:c8:35:52:a6:a9:9a:f1:49:6f:f8:ce:b2
格式化后的HEX数据为:
30 82024C 30 8201F1 A0 03 02 01 02 02 01 01 30 0A 06 08 2A8648CE3D040302 30 49 31 15 30 13 06 03 550403 0C 0C 47534D412054657374204349 31 11 30 0F 06 03 55040B 0C 08 5445535443455254 31 10 30 0E 06 03 55040A 0C 07 52535054455354 31 0B 30 09 06 03 550406 13 02 4954 30 1E 17 0D 3138303332303130343032325A 17 0D 3139303332303130343032325A 30 49 31 15 30 13 06 03 550403 0C 0C 47534D412054657374204349 31 11 30 0F 06 03 55040B 0C 08 5445535443455254 31 10 30 0E 06 03 55040A 0C 07 52535054455354 31 0B 30 09 06 03 550406 13 02 4954 30 59 30 13 06 07 2A8648CE3D0201 06 08 2A8648CE3D030107 03 42 000403F3C1EAEBE69BA4BCD465FBFB74C0824BBEE268D4F98A9A78E35D5451687383E70AFB465ECB625F0AB7A974FFCB2DC9783A3D769E7C9D541D433D407C4554B1 A3 81C9 30 81C6 30 1D 06 03 551D0E 04 16 04 14 00C38B4D635F66AD63707AC334E586A9C90C2200 30 0F 06 03 551D13 01 01 FF 04 05 30 03 01 01 FF 30 17 06 03 551D20 01 01 FF 04 0D 30 0B 30 09 06 07 67811201020100 30 0E 06 03 551D0F 01 01 FF 04 04 03 02 0106 30 0E 06 03 551D11 04 07 30 05 88 03 883701 30 5B 06 03 551D1F 04 54 30 52 30 27 A0 25 A0 23 86 21 687474703A2F2F63692E746573742E67736D612E636F6D2F43524C2D412E63726C 30 27 A0 25 A0 23 86 21 687474703A2F2F63692E746573742E67736D612E636F6D2F43524C2D422E63726C 30 0A 06 08 2A8648CE3D040302 03 49 003046022100E3D68373256F7D5187FB57B3CB4813D7433FA0C8184AD057663B3AD871B6743D022100A9ACFA5187CAB0365E2DA0F56BD79F46193FA297C83552A6A99AF1496FF8CEB2
eum_cert.pem 证书 内容如下:
-----BEGIN CERTIFICATE----- MIICdjCCAhygAwIBAgIBAjAKBggqhkjOPQQDAjBJMRUwEwYDVQQDDAxHU01BIFRl c3QgQ0kxETAPBgNVBAsMCFRFU1RDRVJUMRAwDgYDVQQKDAdSU1BURVNUMQswCQYD VQQGEwJJVDAeFw0xODAzMjAxMDUzMTBaFw0xOTAzMjAxMDUzMTBaMDcxCzAJBgNV BAYTAkRFMRUwEwYDVQQKDAxSU1AgVGVzdCBFVU0xETAPBgNVBAMMCEVVTSBUZXN0 MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEN6881ckTATYOeF/u/dUDi3SqZMAl el2lxE9WZ7OfNBnX991sKUuM/t+lMYe06WukyZBz3uUdOMb1y/7StwsC3aOCAQUw ggEBMB8GA1UdIwQYMBaAFADDi01jX2atY3B6wzTlhqnJDCIAMB0GA1UdDgQWBBSz 5dAdfYCCwotg9Nc0niVmppZNdTAOBgNVHQ8BAf8EBAMCAgQwFwYDVR0gAQH/BA0w CzAJBgdngRIBAgECMA4GA1UdEQQHMAWIA4g3BTASBgNVHRMBAf8ECDAGAQH/AgEA MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jaS50ZXN0LmdzbWEuY29tL0NSTC1C LmNybDA+BgNVHR4BAf8ENDAyoDAwLqQsMCoxFTATBgNVBAoMDFJTUCBUZXN0IEVV TTERMA8GA1UEBRMIODkwNDkwMzIwCgYIKoZIzj0EAwIDSAAwRQIgFESrpMGI/M4v Pq5nE59vQrdygtPArGmSGvQrBHDYlTMCIQDZi8kQq781z3WjNkFwjLfzl6hKLoAj p62o90NQ39nIXg== -----END CERTIFICATE-----
执行openssl x509 -in eum_cert.pem -text -noout得到如下信息:
λ openssl x509 -in eum_cert.pem -text -noout Certificate: Data: Version: 3 (0x2) Serial Number: 2 (0x2) Signature Algorithm: ecdsa-with-SHA256 Issuer: CN=GSMA Test CI, OU=TESTCERT, O=RSPTEST, C=IT Validity Not Before: Mar 20 10:53:10 2018 GMT Not After : Mar 20 10:53:10 2019 GMT Subject: C=DE, O=RSP Test EUM, CN=EUM Test Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) pub: 04:37:af:3c:d5:c9:13:01:36:0e:78:5f:ee:fd:d5: 03:8b:74:aa:64:c0:25:7a:5d:a5:c4:4f:56:67:b3: 9f:34:19:d7:f7:dd:6c:29:4b:8c:fe:df:a5:31:87: b4:e9:6b:a4:c9:90:73:de:e5:1d:38:c6:f5:cb:fe: d2:b7:0b:02:dd ASN1 OID: prime256v1 NIST CURVE: P-256 X509v3 extensions: X509v3 Authority Key Identifier: 00:C3:8B:4D:63:5F:66:AD:63:70:7A:C3:34:E5:86:A9:C9:0C:22:00 X509v3 Subject Key Identifier: B3:E5:D0:1D:7D:80:82:C2:8B:60:F4:D7:34:9E:25:66:A6:96:4D:75 X509v3 Key Usage: critical Certificate Sign X509v3 Certificate Policies: critical Policy: 2.23.146.1.2.1.2 X509v3 Subject Alternative Name: Registered ID:2.999.5 X509v3 Basic Constraints: critical CA:TRUE, pathlen:0 X509v3 CRL Distribution Points: Full Name: URI:http://ci.test.gsma.com/CRL-B.crl X509v3 Name Constraints: critical Permitted: DirName:O = RSP Test EUM, serialNumber = 89049032 Signature Algorithm: ecdsa-with-SHA256 Signature Value: 30:45:02:20:14:44:ab:a4:c1:88:fc :ce:2f:3e:ae:67:13:9f: 6f:42:b7:72:82:d3:c0:ac:69:92:1a:f4:2b:04:70:d8:95:33: 02:21:00:d9:8b:c9:10:ab:bf:35:cf:75:a3:36:41:70:8c:b7: f3:97:a8:4a:2e:80:23:a7:ad:a8:f7:43:50:df:d9:c8:5e
格式化后的HEX数据为
30 820276 30 82021C A0 03 02 01 02 02 01 02 30 0A 06 08 2A8648CE3D040302 30 49 31 15 30 13 06 03 550403 0C 0C 47534D412054657374204349 31 11 30 0F 06 03 55040B 0C 08 5445535443455254 31 10 30 0E 06 03 55040A 0C 07 52535054455354 31 0B 30 09 06 03 550406 13 02 4954 30 1E 17 0D 3138303332303130353331305A 17 0D 3139303332303130353331305A 30 37 31 0B 30 09 06 03 550406 13 02 4445 31 15 30 13 06 03 55040A 0C 0C 52535020546573742045554D 31 11 30 0F 06 03 550403 0C 08 45554D2054657374 30 59 30 13 06 07 2A8648CE3D0201 06 08 2A8648CE3D030107 03 42 000437AF3CD5C91301360E785FEEFDD5038B74AA64C0257A5DA5C44F5667B39F3419D7F7DD6C294B8CFEDFA53187B4E96BA4C99073DEE51D38C6F5CBFED2B70B02DD A3 820105 30 820101 30 1F 06 03 551D23 04 18 30 16 80 14 00C38B4D635F66AD63707AC334E586A9C90C2200 30 1D 06 03 551D0E 04 16 04 14 B3E5D01D7D8082C28B60F4D7349E2566A6964D75 30 0E 06 03 551D0F 01 01 FF 04 04 03 02 0204 30 17 06 03 551D20 01 01 FF 04 0D 30 0B 30 09 06 07 67811201020102 30 0E 06 03 551D11 04 07 30 05 88 03 883705 30 12 06 03 551D13 01 01 FF 04 08 30 06 01 01 FF 02 01 00 30 32 06 03 551D1F 04 2B 30 29 30 27 A0 25 A0 23 86 21 687474703A2F2F63692E746573742E67736D612E636F6D2F43524C2D422E63726C 30 3E 06 03 551D1E 01 01 FF 04 34 30 32 A0 30 30 2E A4 2C 30 2A 31 15 30 13 06 03 55040A 0C 0C 52535020546573742045554D 31 11 30 0F 06 03 550405 13 08 3839303439303332 30 0A 06 08 2A8648CE3D040302 03 48 00304502201444ABA4C188FCCE2F3EAE67139F6F42B77282D3C0AC69921AF42B0470D89533022100D98BC910ABBF35CF75A33641708CB7F397A84A2E8023A7ADA8F74350DFD9C85E
其中subject部分的数据为:
30 37 31 0B 30 09 06 03 550406 (OBJECT IDENTIFIER, 2.5.4.6 [Country (C) - 国家/地区,使用双字符代码]) 13 02 4445 (PrintableString, 'DE' ) 31 15 30 13 06 03 55040A (OBJECT IDENTIFIER, 2.5.4.10 [Organization (O) - 组织或机构名称]) 0C 0C 52535020546573742045554D (UTF8String, 'RSP Test EUM' ) 31 11 30 0F 06 03 550403 (OBJECT IDENTIFIER, 2.5.4.3 [Common Name (CN) - 通用名称,通常代表域名或主体名]) 0C 08 45554D2054657374 (UTF8String, 'EUM Test' )
euicc_cert.pem证书 内容如下:
-----BEGIN CERTIFICATE----- MIIB9TCCAZugAwIBAgIBBjAKBggqhkjOPQQDAjA3MQswCQYDVQQGEwJERTEVMBMG A1UECgwMUlNQIFRlc3QgRVVNMREwDwYDVQQDDAhFVU0gVGVzdDAeFw0xODAzMjAx MTAzMjZaFw0xOTAzMjAxMTAzMjZaMGQxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxS U1AgVGVzdCBFVU0xKTAnBgNVBAUTIDg5MDAxMTIyMzM0NDU1NjY3Nzg4OTlBQUJC Q0NEREVFMRMwEQYDVQQDDApUZXN0IGVVSUNDMFkwEwYHKoZIzj0CAQYIKoZIzj0D AQcDQgAEKgfzYS8Oi8QAenoImMkoMHbCw3wY5Qf+xUnKJzrHJvQIHe2N7ZYEJEV+ CjLs8s3AxyfhCsiCqC1uedTHv/4oW6NrMGkwHwYDVR0jBBgwFoAUs+XQHX2AgsKL YPTXNJ4lZqaWTXUwHQYDVR0OBBYEFAKaugw0jWXFTS0SjlcP7OmGNARHMA4GA1Ud DwEB/wQEAwIHgDAXBgNVHSABAf8EDTALMAkGB2eBEgECAQEwCgYIKoZIzj0EAwID SAAwRQIhAIyOOqDnNLqRpohim1M+b1jrfJRnsXSWxWvEZ2m6HjZDAiA7v3e+fn52 3t8caRgKsCeA7nG3OFiP4KMEevjsppuZjg== -----END CERTIFICATE-----
执行openssl x509 -in euicc_cert.pem -text -noout得到如下信息:
λ openssl x509 -in euicc_cert.pem -text -noout Certificate: Data: Version: 3 (0x2) Serial Number: 6 (0x6) Signature Algorithm: ecdsa-with-SHA256 Issuer: C=DE, O=RSP Test EUM, CN=EUM Test Validity Not Before: Mar 20 11:03:26 2018 GMT Not After : Mar 20 11:03:26 2019 GMT Subject: C=DE, O=RSP Test EUM, serialNumber=8900112233445566778899AABBCCDDEE, CN=Test eUICC Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) pub: 04:2a:07:f3:61:2f:0e:8b:c4:00:7a:7a:08:98:c9: 28:30:76:c2:c3:7c:18:e5:07:fe:c5:49:ca:27:3a: c7:26:f4:08:1d:ed:8d:ed:96:04:24:45:7e:0a:32: ec:f2:cd :c0:c7:27:e1:0a:c8:82:a8:2d:6e:79:d4: c7:bf:fe:28:5b ASN1 OID: prime256v1 NIST CURVE: P-256 X509v3 extensions: X509v3 Authority Key Identifier: B3:E5:D0:1D:7D:80:82:C2:8B:60:F4:D7:34:9E:25:66:A6:96:4D:75 X509v3 Subject Key Identifier: 02:9A:BA:0C:34:8D:65:C5:4D:2D:12:8E:57:0F:EC:E9:86:34:04:47 X509v3 Key Usage: critical Digital Signature X509v3 Certificate Policies: critical Policy: 2.23.146.1.2.1.1 Signature Algorithm: ecdsa-with-SHA256 Signature Value: 30:45:02:21:00:8c:8e:3a:a0:e7:34:ba:91:a6:88:62:9b:53: 3e:6f:58:eb:7c:94:67:b1:74:96:c5:6b:c4:67:69:ba:1e:36: 43:02:20:3b:bf:77:be:7e:7e:76:de:df:1c:69:18:0a:b0:27: 80:ee:71:b7:38:58:8f:e0:a3:04:7a:f8:ec:a6:9b:99:8e
格式化后的HEX数据为
30 8201F5 30 82019B A0 03 02 01 02 02 01 06 30 0A 06 08 2A8648CE3D040302 30 37 31 0B 30 09 06 03 550406 13 02 4445 31 15 30 13 06 03 55040A 0C 0C 52535020546573742045554D 31 11 30 0F 06 03 550403 0C 08 45554D2054657374 30 1E 17 0D 3138303332303131303332365A 17 0D 3139303332303131303332365A 30 64 31 0B 30 09 06 03 550406 13 02 4445 31 15 30 13 06 03 55040A 0C 0C 52535020546573742045554D 31 29 30 27 06 03 550405 13 20 3839303031313232333334343535363637373838393941414242434344444545 31 13 30 11 06 03 550403 0C 0A 54657374206555494343 30 59 30 13 06 07 2A8648CE3D0201 06 08 2A8648CE3D030107 03 42 00042A07F3612F0E8BC4007A7A0898C9283076C2C37C18E507FEC549CA273AC726F4081DED8DED960424457E0A32ECF2CDC0C727E10AC882A82D6E79D4C7BFFE285B A3 6B 30 69 30 1F 06 03 551D23 04 18 30 16 80 14 B3E5D01D7D8082C28B60F4D7349E2566A6964D75 30 1D 06 03 551D0E 04 16 04 14 029ABA0C348D65C54D2D128E570FECE986340447 30 0E 06 03 551D0F 01 01 FF 04 04 03 02 0780 30 17 06 03 551D20 01 01 FF 04 0D 30 0B 30 09 06 07 67811201020101 30 0A 06 08 2A8648CE3D040302 03 48 0030450221008C8E3AA0E734BA91A688629B533E6F58EB7C9467B17496C56BC46769BA1E364302203BBF77BE7E7E76DEDF1C69180AB02780EE71B738588FE0A3047AF8ECA69B998E
其中subject部分的数据为:
30 64 31 0B 30 09 06 03 550406 (OBJECT IDENTIFIER, 2.5.4.6 [Country (C) - 国家/地区,使用双字符代码]) 13 02 4445 (PrintableString, 'DE' ) 31 15 30 13 06 03 55040A (OBJECT IDENTIFIER, 2.5.4.10 [Organization (O) - 组织或机构名称]) 0C 0C 52535020546573742045554D (UTF8String, 'RSP Test EUM' ) 31 29 30 27 06 03 550405 (OBJECT IDENTIFIER, 2.5.4.5 [Serial Number - 序列号,设备或证书的序列标识]) 13 20 3839303031313232333334343535363637373838393941414242434344444545 (PrintableString, '8900112233445566778899AABBCCDDEE' ) 31 13 30 11 06 03 550403 (OBJECT IDENTIFIER, 2.5.4.3 [Common Name (CN) - 通用名称,通常代表域名或主体名]) 0C 0A 54657374206555494343 (UTF8String, 'Test eUICC' )
证书链数据解读 从上面的证书链数据可以看出:
CI证书只有Subject Key Identifier字段,没有Authority Key Identifier字段。
被颁发的证书的Authority Key Identifier字段的值等于颁发者证书的Subject Key Identifier的值
对于证书来说cipkid的值即为其Authority Key Identifier字段的值 。
特别注意:subject中的序列号(2.5.4.5 serialNumber X.520 DN component)与证书主体TBSCertificate中的序列号 (serialNumber CertificateSerialNumber)是两回事
证书签名算法与公钥签名算法 对于证书
-----BEGIN CERTIFICATE----- MIICdjCCAhygAwIBAgIBAjAKBggqhkjOPQQDAjBJMRUwEwYDVQQDDAxHU01BIFRl c3QgQ0kxETAPBgNVBAsMCFRFU1RDRVJUMRAwDgYDVQQKDAdSU1BURVNUMQswCQYD VQQGEwJJVDAeFw0xODAzMjAxMDUzMTBaFw0xOTAzMjAxMDUzMTBaMDcxCzAJBgNV BAYTAkRFMRUwEwYDVQQKDAxSU1AgVGVzdCBFVU0xETAPBgNVBAMMCEVVTSBUZXN0 MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEN6881ckTATYOeF/u/dUDi3SqZMAl el2lxE9WZ7OfNBnX991sKUuM/t+lMYe06WukyZBz3uUdOMb1y/7StwsC3aOCAQUw ggEBMB8GA1UdIwQYMBaAFADDi01jX2atY3B6wzTlhqnJDCIAMB0GA1UdDgQWBBSz 5dAdfYCCwotg9Nc0niVmppZNdTAOBgNVHQ8BAf8EBAMCAgQwFwYDVR0gAQH/BA0w CzAJBgdngRIBAgECMA4GA1UdEQQHMAWIA4g3BTASBgNVHRMBAf8ECDAGAQH/AgEA MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9jaS50ZXN0LmdzbWEuY29tL0NSTC1C LmNybDA+BgNVHR4BAf8ENDAyoDAwLqQsMCoxFTATBgNVBAoMDFJTUCBUZXN0IEVV TTERMA8GA1UEBRMIODkwNDkwMzIwCgYIKoZIzj0EAwIDSAAwRQIgFESrpMGI/M4v Pq5nE59vQrdygtPArGmSGvQrBHDYlTMCIQDZi8kQq781z3WjNkFwjLfzl6hKLoAj p62o90NQ39nIXg== -----END CERTIFICATE-----
解析后可以得到:algorithm OBJECT IDENTIFIER 1.2.840.10045.4.3.2 ecdsaWithSHA256 (ANSI X9.62 ECDSA algorithm with SHA256)
algorithm OBJECT IDENTIFIER 1.2.840.10045.2.1 ecPublicKey (ANSI X9.62 public key type)
parameters ANY OBJECT IDENTIFIER 1.2.840.10045.3.1.7 prime256v1 (ANSI X9.62 named elliptic curve)
这三个 OID 分别出现在证书的不同部分,各自有不同的作用:
1.2.840.10045.4.3.2 (ecdsaWithSHA256)
位置: 证书的签名算法字段(Signature Algorithm)
作用:
指定了证书签发者(CA)对整个证书进行数字签名时使用的算法
具体含义:使用 ECDSA 算法,配合 SHA-256 哈希函数
这个 OID 告诉验证者如何验证证书的签名完整性
1.2.840.10045.2.1 (ecPublicKey)
位置: 证书主体公钥信息中的算法字段(Subject Public Key Info -> Algorithm)
作用:
标识该证书主体的公钥类型为椭圆曲线公钥
表明这是一个 ECC(Elliptic Curve Cryptography)公钥
这个 OID 告诉应用程序如何使用这个公钥(用于 ECDH 密钥交换或 ECDSA 签名验证)
1.2.840.10045.3.1.7 (prime256v1)
位置: 上述 ecPublicKey 字段中的参数部分(Parameters)
作用:
指定了具体的椭圆曲线参数
prime256v1(也称为 NIST P-256 或 secp256r1)是特定的 256 位素数域椭圆曲线
这个 OID 定义了使用的曲线方程、基点、阶等数学参数
三者关系
这三个 OID 共同定义了一个完整的 ECC 证书体系:
ecPublicKey 定义了公钥类型
prime256v1 定义了具体使用的椭圆曲线
ecdsaWithSHA256 定义了证书签名的算法
简单来说:这是一个使用 NIST P-256 曲线 的 ECC 证书,其公钥类型是 EC 公钥,整个证书的签名使用的是 ECDSA with SHA-256 算法。
证书签名的算法和公钥类型的区别 比喻:印章和印章图案
想象一下印章 和印章印出来的图案 的关系:
公钥类型(ecPublicKey)—— 相当于印章本身
定义了印章的材质和形状 (是木头章还是原子章?是方形还是圆形?)
在证书中,它定义了密钥的数学结构 ——用的是RSA还是ECC
就像印章本身决定了它能印出什么样式的图案
签名算法(ecdsaWithSHA256)—— 相当于印章使用的过程
定义了如何使用印章 (蘸什么颜色的印泥?按多大力?)
在证书中,它定义了如何使用私钥对数据进行签名 ——先哈希再签名,用什么哈希函数
就像印章使用的具体过程决定了最终的印迹效果
为什么需要分开定义? 逻辑分离,职责明确
公钥类型 描述的是静态的密钥本身
签名算法 描述的是动态的使用方式
同一把钥匙(公钥)可以用来做不同的事情(加密、签名、密钥协商)
灵活组合 同一个公钥类型(ECC)可以配合多种签名算法: - ecdsaWithSHA256 - ecdsaWithSHA384 - ecdsaWithSHA512 同一个签名算法(SHA256withRSA)可以用在不同公钥类型上: - RSA 公钥 + SHA256withRSA - ECC 公钥 + SHA256withECDSA(就是本例)
实际验证流程的需要 验证证书签名时,需要两个信息:1. 需要公钥本身的信息 → 公钥类型告诉你怎么解析这个公钥 2. 需要验证签名的方法 → 签名算法告诉你怎么验证 验证步骤: - 先从证书里提取公钥(需要知道是ECC公钥,用prime256v1曲线) - 再用这个公钥,按照ecdsaWithSHA256的规则,验证证书上的签名
具体到这个证书 证书结构: ├── 主体公钥信息 │ ├── 算法: ecPublicKey (告诉你是ECC公钥) │ └── 参数: prime256v1 (告诉你是哪条曲线) │ └── 签名算法: ecdsaWithSHA256 (告诉你怎么验证这个证书的签名) └── 使用上面的公钥和这个算法验证签名
简单总结
公钥类型 = 你的锁的类型 (是机械锁还是电子锁?)
签名算法 = 你用钥匙开锁的方法 (顺时针转两圈?还是刷一下卡片?)
分开定义就像:我知道你有一把电子门锁(公钥类型),但我还需要知道你是刷卡开门还是输入密码开门(签名算法),才能正确验证你的身份。
文章来源于参考: