java.security.cert

接口
异常
java.lang.Object
  继承者 java.security.cert.Certificate
      继承者 java.security.cert.X509Certificate
所有已实现的接口:
Serializable, X509Extension

public abstract class X509Certificate
     
extends Certificate
implements X509Extension

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
 

构造方法详细信息

X509Certificate

protected X509Certificate()
X.509 证书的构造方法。

方法详细信息

checkValidity

public abstract void checkValidity()
                            throws CertificateExpiredException,
                                   CertificateNotYetValidException
检查证书目前是否有效。即当前的日期和时间是否仍在证书中所给定的有效期内。

有效期由两个日期/时间值组成:证书有效的起始和终止日期(和时间)。在 ASN.1 中定义如下:

 validity             Validity

Validity ::= SEQUENCE { notBefore CertificateValidityDate, notAfter CertificateValidityDate }

CertificateValidityDate ::= CHOICE { utcTime UTCTime, generalTime GeneralizedTime }

抛出:
CertificateExpiredException - 如果证书已过期。
CertificateNotYetValidException - 如果证书不再有效。

checkValidity

public abstract void checkValidity(Date date)
                            throws CertificateExpiredException,
                                   CertificateNotYetValidException
检查给定的日期是否处于证书的有效期内。换句话说,这确定该证书在给定的日期/时间是否有效。

参数:
date - 要检查的 Date,以确定此证书在该日期/时间是否有效。
抛出:
CertificateExpiredException - 如果对于所提供的 date 而言该证书已过期。
CertificateNotYetValidException - 如果对于所提供的 date 而言该证书不再有效。
另请参见:
checkValidity()

getVersion

public abstract int getVersion()
获取证书的 version(版本号)值。此内容的 ASN.1 定义如下:
 version  [0] EXPLICIT Version DEFAULT v1

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

返回:
版本号,比如 1、2 或 3。

getSerialNumber

public abstract BigInteger getSerialNumber()
获取证书的 serialNumber 值。序列号是证书颁发机构为每个证书所分配的一个整数。给定的 CA 所发布的每个证书的序列号必须是唯一的(即发布方名称和序列号标识一个唯一的证书)。此内容的 ASN.1 定义如下:
 serialNumber     CertificateSerialNumber

CertificateSerialNumber ::= INTEGER

返回:
序列号。

getIssuerDN

public abstract Principal getIssuerDN()
已过时,由 getIssuerX500Principal() 替代。此方法返回作为特定 Principal 对象实现的 issuer,可移植的代码不应依靠该对象。

获取证书的 issuer(发布方的标识名)值。发布方名称标识了签署(并发布)该证书的实体。

发布方名称字段包含一个 X.500 标识名 (DN)。此内容的 ASN.1 定义如下:

 issuer    Name

Name ::= CHOICE { RDNSequence } RDNSequence ::= SEQUENCE OF RelativeDistinguishedName RelativeDistinguishedName ::= SET OF AttributeValueAssertion AttributeValueAssertion ::= SEQUENCE { AttributeType, AttributeValue } AttributeType ::= OBJECT IDENTIFIER AttributeValue ::= ANY

Name 描述了一个层次结构名,由属性(如国家/地区名)和相应值(如 US)组成。 AttributeValue 组件的类型由 AttributeType 来确定;一般是 directoryStringdirectoryString 通常是 PrintableStringTeletexStringUniversalString 之一。

返回:
一个 Principal,其名称是发布方的标识名。

getIssuerX500Principal

public X500Principal getIssuerX500Principal()
X500Principal 的形式返回证书的发布方(发布方标识名)值。

建议子类重写此方法。

返回:
一个表示发布方标识名的 X500Principal
从以下版本开始:
1.4

getSubjectDN

public abstract Principal getSubjectDN()
已过时,由 getSubjectX500Principal() 替代。此方法返回作为特定 Principal 对象实现的 subject,可移植的代码不应依靠该对象。

获取证书的 subject(主体的标识名)值。如果 subject 值为空,则返回的 Principal 对象的 getName() 方法将返回一个空字符串 ("")。

此内容的 ASN.1 定义如下:

 subject    Name
 

有关 Name 和其他相关定义的信息,请参见 getIssuerDN

返回:
一个 Principal,其名称是主体名。

getSubjectX500Principal

public X500Principal getSubjectX500Principal()
X500Principal 的形式返回证书的主体(主体标识名)值。如果 subject 值为空,则返回的 X500Principal 对象的 getName() 方法将返回一个空字符串 ("")。

建议子类重写此方法。

返回:
一个表示主体标识名的 X500Principal
从以下版本开始:
1.4

getNotBefore

public abstract Date getNotBefore()
获取证书有效期的 notBefore 日期。相关的 ASN.1 定义如下:
 validity             Validity

Validity ::= SEQUENCE { notBefore CertificateValidityDate, notAfter CertificateValidityDate }

CertificateValidityDate ::= CHOICE { utcTime UTCTime, generalTime GeneralizedTime }

返回:
有效期的起始日期。
另请参见:
checkValidity()

getNotAfter

public abstract Date getNotAfter()
获取证书有效期的 notAfter 日期。有关相关的 ASN.1 定义,请参见 getNotBefore

返回:
有效期的终止日期。
另请参见:
checkValidity()

getTBSCertificate

public abstract byte[] getTBSCertificate()
                                  throws CertificateEncodingException
从此证书中获取以 DER 编码的证书信息,即 tbsCertificate。这可用于独立验证签名。

返回:
以 DER 编码的证书信息。
抛出:
CertificateEncodingException - 如果发生编码错误。

getSignature

public abstract byte[] getSignature()
获取证书的 signature 值(原始签名位)。此内容的 ASN.1 定义如下:
 signature     BIT STRING  
 

返回:
签名。

getSigAlgName

public abstract String getSigAlgName()
获取证书签名算法的签名算法名。例如字符串 "SHA-1/DSA"。此内容的 ASN.1 定义如下:
 signatureAlgorithm   AlgorithmIdentifier

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

根据 algorithm OID 字符串确定该算法名。

返回:
签名算法名。

getSigAlgOID

public abstract String getSigAlgOID()
获取证书的签名算法 OID 字符串。OID 由一组句点分隔的非负整数集来表示。例如,按照 RFC 2459 中的规定,字符串 "1.2.840.10040.4.3" 标识使用 DSA 签名算法的 SHA-1。

有关相关的 ASN.1 定义,请参见 getSigAlgName

返回:
签名算法 OID 字符串。

getSigAlgParams

public abstract byte[] getSigAlgParams()
从此证书的签名算法中获取 DER 编码形式的签名算法参数。在大多数情况下,该签名算法参数为 null;该参数通常提供证书的公钥。如果需要访问个别参数值,则使用 AlgorithmParameters,并使用 getSigAlgName 所返回的名称进行实例化。

有关相关的 ASN.1 定义,请参见 getSigAlgName

返回:
DER 编码形式的签名算法参数,如果没有该参数,则返回 null。

getIssuerUniqueID

public abstract boolean[] getIssuerUniqueID()
获取证书的 issuerUniqueID 值。证书中发布方的唯一标识符用于处理以后可能出现的发布方名称重用的情况。RFC 2459 建议不重用该名称,并建议合格的证书不要使用唯一标识符。遵守该配置文件的应用程序应该能够解析唯一标识符并进行比较。

此内容的 ASN.1 定义如下:

 issuerUniqueID  [1]  IMPLICIT UniqueIdentifier OPTIONAL

UniqueIdentifier ::= BIT STRING

返回:
发布方的唯一标识符,如果证书中没有该标识符,则返回 null。

getSubjectUniqueID

public abstract boolean[] getSubjectUniqueID()
获取证书的 subjectUniqueID 值。

此内容的 ASN.1 定义如下:

 subjectUniqueID  [2]  IMPLICIT UniqueIdentifier OPTIONAL

UniqueIdentifier ::= BIT STRING

返回:
主体唯一标识符,如果证书中没有该标识符,则返回 null。

getKeyUsage

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 建议,使用该扩展时将其标记为关键扩展。

返回:
此证书的 KeyUsage 扩展,以 boolean 数组的形式表示。该数组中 KeyUsage 值的顺序与上面 ASN.1 定义中的顺序相同。该数组将包含上面定义的每个 KeyUsage 的值。如果证书中编码的 KeyUsage 列表要比上面的列表长,则不会截取它。如果此证书不包含 KeyUsage 扩展,则返回 null。

getExtendedKeyUsage

public List<String> getExtendedKeyUsage()
                                 throws CertificateParsingException
获取一个不可修改的 String 列表,表示已扩展的密钥使用扩展 (OID = 2.5.29.37) 中 ExtKeyUsageSyntax 字段的对象标识符(OBJECT IDENTIFIER)。除了或代替 KeyUsage 扩展字段中所指示的基本目的,它还指示了一个或多个使用已认证公钥的目的。此内容的 ASN.1 定义如下:
 ExtKeyUsageSyntax ::= SEQUENCE SIZE (1..MAX) OF KeyPurposeId

KeyPurposeId ::= OBJECT IDENTIFIER

任何有需要的组织都可定义 KeyPurpose。依照 IANA 或 ITU-T Rec X.660 | ISO/IEC/ITU 9834-1 的规定分配用于标识 KeyPurpose 的对象标识符

Java 2 Platform Standard Edition 的 1.4 版本中添加了此方法。为了维持与现有服务提供者的后向兼容性,没有 abstract 此方法,并且它提供了一个默认实现。子类应该通过正确的实现重写此方法。

返回:
以 String 表示的、对象标识符不可修改的列表形式返回此证书的 ExtendedKeyUsage 扩展。如果此证书不包含 ExtendedKeyUsage 扩展,则返回 null。
抛出:
CertificateParsingException - 如果无法对该扩展进行解码
从以下版本开始:
1.4

getBasicConstraints

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 }
 

返回:
如果证书中有 BasicConstraints 扩展并且该证书的主体是 CA,则返回 pathLenConstraint 的值;否则返回 -1。如果该证书的主体是 CA 并且未出现 pathLenConstraint,则返回 Integer.MAX_VALUE,指示对于该证书路径的长度没有限制。

getSubjectAlternativeNames

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 - 如果无法对该扩展进行解码
从以下版本开始:
1.4

getIssuerAlternativeNames

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 - 如果无法对该扩展进行解码
从以下版本开始:
1.4