java.lang.Object java.security.cert.Certificate java.security.cert.X509Certificate
public abstract class X509Certificate
X.509 证书的抽象类。此类提供了一种访问 X.509 证书所有属性的标准方式。
1996 年 6 月,ISO/IEC 和 ANSI X9 完成了基本的 X.509 v3 格式,在 ASN.1 中描述如下:
Certificate ::= SEQUENCE { tbsCertificate TBSCertificate, signatureAlgorithm AlgorithmIdentifier, signature BIT STRING }
这些证书被广泛使用以支持 Internet 安全系统中的身份验证和其他功能。常见的应用包括增强保密邮件 (PEM)、传输层安全 (SSL)、用于受信任软件发布的代码签名和安全电子交易 (SET)。
由证书颁发机构 (CA) 来管理和担保这些证书。CA 的工作是创建证书,方法是将数据置于 X.509 标准格式,然后以数字方式签署该数据。CA 充当受信任的第三方,在不能直接通信的主体之间传递信息。CA 证书可由其自身签名,也可由其他 CA 签名,如“根”CA。
在 RFC 2459,即 "Internet X.509 Public Key Infrastructure Certificate and CRL Profile"(位于 http://www.ietf.org/rfc/rfc2459.txt )中可找到更多信息。
tbsCertificate
的 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, -- If present, version must be v2 or v3 subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL, -- If present, version must be v2 or v3 extensions [3] EXPLICIT Extensions OPTIONAL -- If present, version must be v3 }
使用证书工厂来实例化证书。下面的示例演示了如何实例化一个 X.509 证书。
InputStream inStream = new FileInputStream("fileName-of-cert"); CertificateFactory cf = CertificateFactory.getInstance("X.509"); X509Certificate cert = (X509Certificate)cf.generateCertificate(inStream); inStream.close();
Certificate
,
CertificateFactory
,
X509Extension
,
序列化表格
嵌套类摘要 |
---|
从类 java.security.cert.Certificate 继承的嵌套类/接口 |
---|
Certificate.CertificateRep |
构造方法摘要 | |
---|---|
protected |
X509Certificate() X.509 证书的构造方法。 |
方法摘要 | |
---|---|
abstract void |
checkValidity() 检查证书目前是否有效。 |
abstract void |
checkValidity(Date date) 检查给定的日期是否处于证书的有效期内。 |
abstract int |
getBasicConstraints() 从关键 BasicConstraints 扩展 (OID = 2.5.29.19) 中获取证书的限制路径长度。 |
List<String> |
getExtendedKeyUsage() 获取一个不可修改的 String 列表,表示已扩展的密钥使用扩展 (OID = 2.5.29.37) 中 ExtKeyUsageSyntax 字段的对象标识符(OBJECT IDENTIFIER)。 |
Collection<List<?>> |
getIssuerAlternativeNames() 从 IssuerAltName 扩展 (OID = 2.5.29.18) 中获取一个发布方替换名称的不可变集合。 |
abstract Principal |
getIssuerDN() 已过时,由 getIssuerX500Principal() 替代。 |
abstract boolean[] |
getIssuerUniqueID() 获取证书的 issuerUniqueID 值。 |
X500Principal |
getIssuerX500Principal() 以 X500Principal 的形式返回证书的发布方(发布方标识名)值。 |
abstract boolean[] |
getKeyUsage() 获取一个表示 KeyUsage 扩展 (OID = 2.5.29.15) 的各个位的 boolean 数组。 |
abstract Date |
getNotAfter() 获取证书有效期的 notAfter 日期。 |
abstract Date |
getNotBefore() 获取证书有效期的 notBefore 日期。 |
abstract BigInteger |
getSerialNumber() 获取证书的 serialNumber 值。 |
abstract String |
getSigAlgName() 获取证书签名算法的签名算法名。 |
abstract String |
getSigAlgOID() 获取证书的签名算法 OID 字符串。 |
abstract byte[] |
getSigAlgParams() 从此证书的签名算法中获取 DER 编码形式的签名算法参数。 |
abstract byte[] |
getSignature() 获取证书的 signature 值(原始签名位)。 |
Collection<List<?>> |
getSubjectAlternativeNames() 从 SubjectAltName 扩展 (OID = 2.5.29.17) 中获取一个主体替换名称的不可变集合。 |
abstract Principal |
getSubjectDN() 已过时,由 getSubjectX500Principal() 替代。 |
abstract boolean[] |
getSubjectUniqueID() 获取证书的 subjectUniqueID 值。 |
X500Principal |
getSubjectX500Principal() 以 X500Principal 的形式返回证书的主体(主体标识名)值。 |
abstract byte[] |
getTBSCertificate() 从此证书中获取以 DER 编码的证书信息,即 tbsCertificate 。 |
abstract int |
getVersion() 获取证书的 version (版本号)值。 |
从类 java.security.cert.Certificate 继承的方法 |
---|
equals, getEncoded, getPublicKey, getType, hashCode, toString, verify, verify, writeReplace |
从类 java.lang.Object 继承的方法 |
---|
clone, finalize, getClass, notify, notifyAll, wait, wait, wait |
从接口 java.security.cert.X509Extension 继承的方法 |
---|
getCriticalExtensionOIDs, getExtensionValue, getNonCriticalExtensionOIDs, hasUnsupportedCriticalExtension |
构造方法详细信息 |
---|
protected X509Certificate()
方法详细信息 |
---|
public abstract void checkValidity() throws CertificateExpiredException, CertificateNotYetValidException
有效期由两个日期/时间值组成:证书有效的起始和终止日期(和时间)。在 ASN.1 中定义如下:
validity ValidityValidity ::= SEQUENCE { notBefore CertificateValidityDate, notAfter CertificateValidityDate }
CertificateValidityDate ::= CHOICE { utcTime UTCTime, generalTime GeneralizedTime }
CertificateExpiredException
- 如果证书已过期。
CertificateNotYetValidException
- 如果证书不再有效。
public abstract void checkValidity(Date date) throws CertificateExpiredException, CertificateNotYetValidException
date
- 要检查的 Date,以确定此证书在该日期/时间是否有效。
CertificateExpiredException
- 如果对于所提供的
date
而言该证书已过期。
CertificateNotYetValidException
- 如果对于所提供的
date
而言该证书不再有效。
checkValidity()
public abstract int getVersion()
version
(版本号)值。此内容的 ASN.1 定义如下:
version [0] EXPLICIT Version DEFAULT v1Version ::= INTEGER { v1(0), v2(1), v3(2) }
public abstract BigInteger getSerialNumber()
serialNumber
值。序列号是证书颁发机构为每个证书所分配的一个整数。给定的 CA 所发布的每个证书的序列号必须是唯一的(即发布方名称和序列号标识一个唯一的证书)。此内容的 ASN.1 定义如下:
serialNumber CertificateSerialNumberCertificateSerialNumber ::= INTEGER
public abstract Principal getIssuerDN()
issuer
,可移植的代码不应依靠该对象。
获取证书的 issuer
(发布方的标识名)值。发布方名称标识了签署(并发布)该证书的实体。
发布方名称字段包含一个 X.500 标识名 (DN)。此内容的 ASN.1 定义如下:
issuer NameName ::= CHOICE { RDNSequence } RDNSequence ::= SEQUENCE OF RelativeDistinguishedName RelativeDistinguishedName ::= SET OF AttributeValueAssertion AttributeValueAssertion ::= SEQUENCE { AttributeType, AttributeValue } AttributeType ::= OBJECT IDENTIFIER AttributeValue ::= ANY
Name
描述了一个层次结构名,由属性(如国家/地区名)和相应值(如 US)组成。
AttributeValue
组件的类型由
AttributeType
来确定;一般是
directoryString
。
directoryString
通常是
PrintableString
、
TeletexString
或
UniversalString
之一。
public X500Principal getIssuerX500Principal()
X500Principal
的形式返回证书的发布方(发布方标识名)值。
建议子类重写此方法。
X500Principal
public abstract Principal getSubjectDN()
subject
,可移植的代码不应依靠该对象。
获取证书的 subject
(主体的标识名)值。如果 subject
值为空,则返回的 Principal
对象的 getName()
方法将返回一个空字符串 ("")。
此内容的 ASN.1 定义如下:
subject Name
有关 Name
和其他相关定义的信息,请参见 getIssuerDN
。
public X500Principal getSubjectX500Principal()
X500Principal
的形式返回证书的主体(主体标识名)值。如果 subject 值为空,则返回的
X500Principal
对象的
getName()
方法将返回一个空字符串 ("")。
建议子类重写此方法。
X500Principal
public abstract Date getNotBefore()
notBefore
日期。相关的 ASN.1 定义如下:
validity ValidityValidity ::= SEQUENCE { notBefore CertificateValidityDate, notAfter CertificateValidityDate }
CertificateValidityDate ::= CHOICE { utcTime UTCTime, generalTime GeneralizedTime }
checkValidity()
public abstract Date getNotAfter()
notAfter
日期。有关相关的 ASN.1 定义,请参见
getNotBefore
。
checkValidity()
public abstract byte[] getTBSCertificate() throws CertificateEncodingException
tbsCertificate
。这可用于独立验证签名。
CertificateEncodingException
- 如果发生编码错误。
public abstract byte[] getSignature()
signature
值(原始签名位)。此内容的 ASN.1 定义如下:
signature BIT STRING
public abstract String getSigAlgName()
signatureAlgorithm AlgorithmIdentifierAlgorithmIdentifier ::= 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
根据 algorithm
OID 字符串确定该算法名。
public abstract String getSigAlgOID()
有关相关的 ASN.1 定义,请参见 getSigAlgName
。
public abstract byte[] getSigAlgParams()
AlgorithmParameters
,并使用
getSigAlgName
所返回的名称进行实例化。
有关相关的 ASN.1 定义,请参见 getSigAlgName
。
public abstract boolean[] getIssuerUniqueID()
issuerUniqueID
值。证书中发布方的唯一标识符用于处理以后可能出现的发布方名称重用的情况。RFC 2459 建议不重用该名称,并建议合格的证书不要使用唯一标识符。遵守该配置文件的应用程序应该能够解析唯一标识符并进行比较。
此内容的 ASN.1 定义如下:
issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONALUniqueIdentifier ::= BIT STRING
public abstract boolean[] getSubjectUniqueID()
subjectUniqueID
值。
此内容的 ASN.1 定义如下:
subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONALUniqueIdentifier ::= BIT STRING
public abstract boolean[] getKeyUsage()
KeyUsage
扩展 (OID = 2.5.29.15) 的各个位的 boolean 数组。KeyUsage 扩展定义证书中所含密钥的目的(如编码、签名、证书签署)。此内容的 ASN.1 定义如下:
KeyUsage ::= BIT STRING { digitalSignature (0), nonRepudiation (1), keyEncipherment (2), dataEncipherment (3), keyAgreement (4), keyCertSign (5), cRLSign (6), encipherOnly (7), decipherOnly (8) }RFC 2459 建议,使用该扩展时将其标记为关键扩展。
public List<String> getExtendedKeyUsage() throws CertificateParsingException
ExtKeyUsageSyntax
字段的对象标识符(OBJECT IDENTIFIER)。除了或代替 KeyUsage 扩展字段中所指示的基本目的,它还指示了一个或多个使用已认证公钥的目的。此内容的 ASN.1 定义如下:
ExtKeyUsageSyntax ::= SEQUENCE SIZE (1..MAX) OF KeyPurposeId任何有需要的组织都可定义 KeyPurpose。依照 IANA 或 ITU-T Rec X.660 | ISO/IEC/ITU 9834-1 的规定分配用于标识 KeyPurpose 的对象标识符KeyPurposeId ::= OBJECT IDENTIFIER
Java 2 Platform Standard Edition 的 1.4 版本中添加了此方法。为了维持与现有服务提供者的后向兼容性,没有 abstract
此方法,并且它提供了一个默认实现。子类应该通过正确的实现重写此方法。
CertificateParsingException
- 如果无法对该扩展进行解码
public abstract int getBasicConstraints()
BasicConstraints
扩展 (OID = 2.5.29.19) 中获取证书的限制路径长度。
BasicConstraints 扩展标识证书的主体是否为一个证书颁发机构 (CA),以及通过该 CA 的证书路径的深度。仅在将 cA
设置为 TRUE 时,pathLenConstraint
字段(参见以下内容)才有意义。在这种情况下,它给出证书路径中此证书后面的最大 CA 证书数。值为零指示路径中只有一个终端实体证书。
注意,对于 RFC 2459,如果 cA
为 TRUE(意味着此证书属于证书颁发机构),则始终将此扩展标记为关键的。
此内容的 ASN.1 定义如下:
BasicConstraints ::= SEQUENCE { cA BOOLEAN DEFAULT FALSE, pathLenConstraint INTEGER (0..MAX) OPTIONAL }
pathLenConstraint
的值;否则返回 -1。如果该证书的主体是 CA 并且未出现
pathLenConstraint
,则返回
Integer.MAX_VALUE
,指示对于该证书路径的长度没有限制。
public Collection<List<?>> getSubjectAlternativeNames() throws CertificateParsingException
SubjectAltName
扩展 (OID = 2.5.29.17) 中获取一个主体替换名称的不可变集合。
SubjectAltName
扩展的 ASN.1 定义如下:
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}
如果此证书不包含 SubjectAltName
扩展,则返回 null
。否则返回一个 Collection
,其中的项表示该扩展中所包括的每个 GeneralName
。每一项都是一个 List
,该 List 的第一项是一个 Integer
(0-8,表示名称类型),第二项是一个 String
或 byte 数组(分别为 string 或 ASN.1 DER 编码形式,表示名称)。
RFC 822、DNS 和 URI 名称是使用这些类型已定义的 string 格式(受 RFC 2459 中所包括的限制的影响)以 String
的形式返回的。使用四点表示法(dotted quad notation)返回 IPv4 地址名。以 "a1:a2:...:a8" 的形式返回 IPv6 地址名,其中 a1-a8 是十六进制值,表示该地址的 8 个 16 位部分。以 String
形式返回 OID 名称,该字符串用一系列句点分隔的非负整数来表示。以 RFC 2253 string 格式返回目录名(标识名)。没有为 otherNames、X.400 名、EDI 方名或其他所有类型的名称定义标准的 string 格式。它们是以 byte 数组的形式返回的,其中包含 ASN.1 DER 编码形式的名称。
注意,返回的 Collection
可能包含多个相同类型的名称。另外还要注意,返回的 Collection
是不可变的,并且将复制 byte 数组中所包含的所有项,以防止后续的修改。
Java 2 Platform Standard Edition 的 1.4 版本中添加了此方法。为了维持与现有服务提供者的后向兼容性,没有 abstract
此方法,并且它提供了一个默认实现。子类应该通过正确的实现重写此方法。
Collection
(或者为
null
)
CertificateParsingException
- 如果无法对该扩展进行解码
public Collection<List<?>> getIssuerAlternativeNames() throws CertificateParsingException
IssuerAltName
扩展 (OID = 2.5.29.18) 中获取一个发布方替换名称的不可变集合。
IssuerAltName
扩展的 ASN.1 定义如下:
IssuerAltName ::= GeneralNames在
getSubjectAlternativeNames
中定义了
GeneralNames
的 ASN.1 定义。
如果此证书不包含 IssuerAltName
扩展,则返回 null
。否则返回一个 Collection
,其中的项表示该扩展中所包括的每个 GeneralName
。每一项都是一个 List
,该 List 的第一项是一个 Integer
(0-8,表示名称类型),第二项是一个 String
或 byte 数组(分别为 string 或 ASN.1 DER 编码形式,表示名称)。有关每种名称类型所用格式的更多细节,请参见 getSubjectAlternativeNames
方法。
注意,返回的 Collection
可能包含多个相同类型的名称。另外还要注意,返回的 Collection
是不可变的,并且将复制 byte 数组中所包含的所有项,以防止后续的修改。
Java 2 Platform Standard Edition 的 1.4 版本中添加了此方法。为了维持与现有服务提供者的后向兼容性,没有 abstract
此方法,并且它提供了一个默认实现。子类应该通过正确的实现重写此方法。
Collection
(或者为
null
)
CertificateParsingException
- 如果无法对该扩展进行解码