3.5.3 X509Certificate

X509Certificate类是Certificate类的子类,它同样是一个抽象类。


//X.509证书的抽象类。此类提供了一种访问X.509证书所有属性的标准方式。

public abstract class X509Certificate

extends Certificate

implements X509Extension


❑方法详述

得到X.509类型的证书对象后,我们最先要做的事情就是校验证书是否有效。

证书的有效期是一个区间范围,也就是起止时间,可用以下两个方法校验:


//获取证书有效期的notAfter日期。

public abstract Date getNotAfter()

//获取证书有效期的notBefore日期。

public abstract Date getNotBefore()


除了上述两种方法,还可以校验给定日期是否处于证书的有效期内:


//检查给定的日期是否处于证书的有效期内。

public abstract void checkValidity(Date date)


下述这个方法就更为简单了,它将校验当前时间是否处于证书的有效期内:


//检查证书目前是否有效。

public abstract void checkValidity()


除了上述校验功能外,还可通过以下方法获得证书的相应属性。

我们可以通过如下方法获得一些简单的证书基本信息:


//获取证书的version(版本号)值。如1、2或3。

public abstract int getVersion()

//获取证书的serialNumber值。

public abstract BigInteger getSerialNumber()

/从关键BasicConstraints扩展(OID=2.5.29.19)中获取证书的限制路径长度。/

public abstract int getBasicConstraints()


以下方法可以获得证书中KeyUsage的相关信息:


/获取一个表示KeyUsage扩展(OID=2.5.29.15)的各个位的boolean数组。/

public abstract boolean[]getKeyUsage()

/获取一个不可修改的String列表,表示已扩展的密钥使用扩展(OID=2.5.29.37)中ExtKeyUsageSyntax字段的对象标识符(OBJECT IDENTIFIER)。/

public List<String>getExtendedKeyUsage()


我们可以通过如下方法获得证书的发布者的相关信息:


/从IssuerAltName扩展(OID=2.5.29.18)中获取一个发布方替换名称的不可变集合。/

public Collection<List<?>>getIssuerAlternativeNames()

//获取证书的issuerUniqueID值。

public abstract boolean[]getIssuerUniqueID()

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

public X500Principal getIssuerX500Principal()


以下方法可以获得证书主体的一些相关信息:


/从SubjectAltName扩展(OID=2.5.29.17)中获取一个主体替换名称的不可变集合。/

public Collection<List<?>>getSubjectAlternativeNames()

//获取证书的subjectUniqueID值。

public abstract boolean[]getSubjectUniqueID()

//以X500Principal的形式返回证书的主体(主体标识名)值。

public X500Principal getSubjectX500Principal()


我们也可以获得证书的DER编码的二进制信息,方法如下所示:


//从此证书中获取以DER编码的证书信息,即tbsCertificate。

public abstract byte[]getTBSCertificate()


从程序设计的角度来讲,我们更常用到以下这些方法:


//获取证书签名算法的签名算法名。

public abstract String getSigAlgName()

//获取证书的签名算法OID字符串。

public abstract String getSigAlgOID()

//从此证书的签名算法中获取DER编码形式的签名算法参数。

public abstract byte[]getSigAlgParams()


在某些时候,我们更关注证书的签名值,方法如下所示:


//获取证书的signature值(原始签名位)。

public abstract byte[]getSignature()


❑实现示例

我们通过以下代码清单3-22来展示如何通过密钥库获得证书。

代码清单3-22 获得证书签名


//加载密钥库文件

FileInputStream is=new FileInputStream("D:\x.keystore");

//实例化KeyStore对象

KeyStore ks=KeyStore.getInstance("JKS");

//加载密钥库

ks.load(is,"password".toCharArray());

//关闭文件输入流

is.close();

//获得X.509类型证书

X509Certificate x509Certificate=(X509Certificate)ks.getCertificate("alias");

//通过证书标明的签名算法构建Signature对象。

Signature signature=Signature.getInstance(x509Certificate.getSigAlgName());