javax.security.cert

异常
java.lang.Object
  继承者 javax.security.cert.Certificate
      继承者 javax.security.cert.X509Certificate

public abstract class X509Certificate
     
extends Certificate

X.509 v1 证书的抽象类。此类提供了一种访问 X.509 v1 证书所有属性的标准方式。无法通过此接口提供专用于 X.509 v2 或 v3 的属性。以后的 API 发展会提供对全部 X.509 v3 属性的完全访问。

基本的 X.509 格式由 ISO/IEC 和 ANSI X9 所定义,用 ASN.1 描述如下:

 Certificate  ::=  SEQUENCE  {
     tbsCertificate       TBSCertificate,
     signatureAlgorithm   AlgorithmIdentifier,
     signature            BIT STRING  }
 

这些证书被广泛使用以支持 Internet 安全系统中的验证和其他功能。常见的应用包括增强保密邮件 (PEM)、传输层安全 (SSL)、用于受信任软件发布的代码签名和安全电子交易 (SET)。

证书颁发机构 (CA) 来管理和担保这些证书。CA 的工作是创建证书,方法是将数据置于 X.509 标准格式,然后以数字方式签署该数据。CA 充当受信任的第三方,在不能直接通信的主体之间传递信息。CA 证书可由其自身签名,也可由其他 CA 签名,如“根”CA。

tbsCertificate 的 ASN.1 定义是:

 TBSCertificate  ::=  SEQUENCE  {
     version         [0]  EXPLICIT Version DEFAULT v1,
     serialNumber         CertificateSerialNumber,
     signature            AlgorithmIdentifier,
     issuer               Name,
     validity             Validity,
     subject              Name,
     subjectPublicKeyInfo SubjectPublicKeyInfo,
     }
 

下面是实例化 X.509 证书的示例代码:

 
 InputStream inStream = new FileInputStream("fileName-of-cert");
 X509Certificate cert = X509Certificate.getInstance(inStream);
 inStream.close();
 
或者
 byte[] certData = <certificate read from a file, say>
 X509Certificate cert = X509Certificate.getInstance(certData);
 

无论是哪种情况,实例化 X.509 证书的代码都要查找 Java 安全属性文件来找到实际的实现,或者实例化一个默认的实现。

Java 安全属性文件位于指定的 <JAVA_HOME>/lib/security/java.security 文件中。<JAVA_HOME> 是指 java.home 系统属性的值并且指定安装 JRE 的目录。在安全属性文件中,X.509 v1 的默认实现可能如下:

 cert.provider.x509v1=com.sun.security.cert.internal.x509.X509V1CertImpl
 

要想实例化另一个实现,必须更改此 cert.provider.x509v1 属性的值。如果未设置此安全属性,则使用默认实现。目前,由于对安全属性的访问可能有安全限制,所以在类初始化时查找并缓存此值,如果无法访问安全属性,则退而使用默认实现。

注:包 javax.security.cert 中的类用于与早期版本的 Java 安全套接字扩展(Java Secure Socket Extension,JSSE)保持兼容。新的应用程序应该使用 java.security.cert 中的标准 Java SE 证书类。

从以下版本开始:
1.4
另请参见:
Certificate, X509Extension

构造方法摘要
X509Certificate()
           
 
方法摘要
abstract  void checkValidity()
          检查证书目前是否有效。
abstract  void checkValidity(Date date)
          检查指定的日期是否处于证书的有效期内。
static X509Certificate getInstance(byte[] certData)
          实例化一个 X509Certificate 对象,并使用指定的 byte 数组初始化它。
static X509Certificate getInstance(InputStream inStream)
          实例化一个 X509Certificate 对象,并使用从输入流 inStream 读取的数据初始化它。
abstract  Principal getIssuerDN()
          获取证书的 issuer(发布方的标识名)值。
abstract  Date getNotAfter()
          获取证书有效期的 notAfter 日期。
abstract  Date getNotBefore()
          获取证书有效期的 notBefore 日期。
abstract  BigInteger getSerialNumber()
          获取证书的 serialNumber 值。
abstract  String getSigAlgName()
          获取用于该证书签名算法的名称。
abstract  String getSigAlgOID()
          获取证书的签名算法 OID 字符串。
abstract  byte[] getSigAlgParams()
          从此证书的签名算法中获取 DER 编码形式的签名算法参数。
abstract  Principal getSubjectDN()
          获取证书的 subject(主体的标识名)值。
abstract  int getVersion()
          获取证书的 version(版本号)值。
 
从类 javax.security.cert.Certificate 继承的方法
equals, getEncoded, getPublicKey, hashCode, toString, verify, verify
 
从类 java.lang.Object 继承的方法
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
 

构造方法详细信息

X509Certificate

public X509Certificate()
方法详细信息

getInstance

public static final X509Certificate getInstance(InputStream inStream)
                                         throws CertificateException
实例化一个 X509Certificate 对象,并使用从输入流 inStream 读取的数据初始化它。在安全属性文件中,属性 cert.provider.x509v1 的值指定了一个类,而这个类提供了该实现(X509Certificate 是一个抽象类)。

注:期望输入流中只有一个 DER 编码的证书。另外,所有 X509Certificate 子类必须提供以下形式的构造方法:


 public <subClass>(InputStream inStream) ...
 

参数:
inStream - 输入流,为了初始化该证书而要从中读取数据。
返回:
使用从输入流中读取的数据初始化了的X509Certificate 对象。
抛出:
CertificateException - 如果发生类初始化或证书解析错误。

getInstance

public static final X509Certificate getInstance(byte[] certData)
                                         throws CertificateException
实例化一个 X509Certificate 对象,并使用指定的 byte 数组初始化它。由指定为安全属性文件中 cert.provider.x509v1 属性值的类来提供该实现(X509Certificate 是一个抽象类)。

注:所有 X509Certificate 子类必须提供以下形式的构造方法:


 public <subClass>(InputStream inStream) ...
 

参数:
certData - 包含 DER 编码证书的 byte 数组。
返回:
X509Certificate 对象,已使用 certData 中的数据初始化该对象。
抛出:
CertificateException - 如果发生类初始化或证书解析错误。

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) }

返回:
ASN.1 编码形式的版本号,即 0、1 或 2。

getSerialNumber

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

CertificateSerialNumber ::= INTEGER

返回:
序列号。

getIssuerDN

public abstract Principal getIssuerDN()
获取证书的 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,其名称是发布方的标识名。

getSubjectDN

public abstract Principal getSubjectDN()
获取证书的 subject(主体的标识名)值。此内容的 ASN.1 定义如下:
 subject    Name
 

有关 Name 和其他相关定义,请参阅 getIssuerDN

返回:
一个 Principal,其名称是主体名。
另请参见:
getIssuerDN()

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()

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 由一组句点分隔的正数来表示。例如,按照 PKIX 部分 I 中的规定,字符串 "1.2.840.10040.4.3" 标识使用 DSA 签名算法的 SHA-1。

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

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

getSigAlgParams

public abstract byte[] getSigAlgParams()
从此证书的签名算法中获取 DER 编码形式的签名算法参数。在大多数情况下,该签名算法参数为 null;参数通常是与证书的公钥一起提供的。

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

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