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