java.security.cert

接口
异常
所有已知实现类:
X509Certificate, X509CRL, X509CRLEntry

public interface X509Extension

X.509 扩展的接口。

为 X.509 v3 Certificates 和 v2 CRLs(证书撤消列表)所定义的扩展提供了各种方法,用于将其他属性与用户或公钥相关联、管理证书层次结构和管理 CRL 的分发。X.509 扩展格式还允许各种团体定义私有扩展,以承载这些团体的惟一信息。

证书/CRL 中的每种扩展都可以指定为关键的或非关键的。如果使用证书/CRL 的系统(验证证书/CRL 的应用程序)遇到了它无法识别的关键扩展,则它必须拒绝该证书/CRL。如果该系统无法识别非关键扩展,则可将其忽略。

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

 Extensions  ::=  SEQUENCE SIZE (1..MAX) OF Extension

 Extension  ::=  SEQUENCE  {
     extnId        OBJECT IDENTIFIER,
     critical      BOOLEAN DEFAULT FALSE,
     extnValue     OCTET STRING
                   -- contains a DER encoding of a value
                   -- of the type registered for use with
                   -- the extnId object identifier value
 }
 
由于并非所有的扩展都是已知的,所以 getExtensionValue 方法返回扩展值(也就是 extnValue)的 DER 编码形式的 OCTET STRING。然后可由识别该扩展的 来处理该返回值。


方法摘要
 Set<String> getCriticalExtensionOIDs()
          获取实现此接口的对象所管理的证书/CRL 中,被标记为 CRITICAL 的扩展的 OID 字符串 Set。
 byte[] getExtensionValue(String oid)
          获取扩展值 (extnValue) 的 DER 编码 OCTET 字符串,该扩展值由传入的 oid String 标识。
 Set<String> getNonCriticalExtensionOIDs()
          获取实现此接口的对象所管理的证书/CRL 中,被标记为 NON-CRITICAL 的扩展的 OID 字符串 Set。
 boolean hasUnsupportedCriticalExtension()
          检查是否存在不支持的关键扩展。
 

方法详细信息

hasUnsupportedCriticalExtension

boolean hasUnsupportedCriticalExtension()
检查是否存在不支持的关键扩展。

返回:
如果找到了不支持的关键扩展,则返回 true;否则返回 false

getCriticalExtensionOIDs

Set<String> getCriticalExtensionOIDs()
获取实现此接口的对象所管理的证书/CRL 中,被标记为 CRITICAL 的扩展的 OID 字符串 Set。 下面的示例代码从 X509Certificate 中获取一个关键扩展的 Set 并打印 OID:

 InputStream inStrm = new FileInputStream("DER-encoded-Cert");
 CertificateFactory cf = CertificateFactory.getInstance("X.509");
 X509Certificate cert = (X509Certificate)cf.generateCertificate(inStrm);
 inStrm.close();

Set critSet = cert.getCriticalExtensionOIDs(); if (critSet != null && !critSet.isEmpty()) { System.out.println("Set of critical extensions:"); for (Iterator i = critSet.iterator(); i.hasNext();) { String oid = (String)i.next(); System.out.println(oid); } }

返回:
标记为关键扩展的扩展 OID 字符串 Set(如果没有标记为关键的扩展,则返回一个空 Set)。如果根本没有扩展,则此方法返回 null。

getNonCriticalExtensionOIDs

Set<String> getNonCriticalExtensionOIDs()
获取实现此接口的对象所管理的证书/CRL 中,被标记为 NON-CRITICAL 的扩展的 OID 字符串 Set。 下面的示例代码从 X509CRL 已撤消证书项中获取一个非关键扩展的 Set 并打印 OID:

 InputStream inStrm = new FileInputStream("DER-encoded-CRL");
 CertificateFactory cf = CertificateFactory.getInstance("X.509");
 X509CRL crl = (X509CRL)cf.generateCRL(inStrm);
 inStrm.close();

byte[] certData = <DER-encoded certificate data> ByteArrayInputStream bais = new ByteArrayInputStream(certData); X509Certificate cert = (X509Certificate)cf.generateCertificate(bais); bais.close(); X509CRLEntry badCert = crl.getRevokedCertificate(cert.getSerialNumber());

if (badCert != null) { Set nonCritSet = badCert.getNonCriticalExtensionOIDs();

if (nonCritSet != null) for (Iterator i = nonCritSet.iterator(); i.hasNext();) { String oid = (String)i.next(); System.out.println(oid); } }

返回:
标记为非关键扩展的扩展 OID 字符串 Set(如果没有标记为非关键的扩展,则返回一个空 Set)。如果根本没有扩展,则此方法返回 null。

getExtensionValue

byte[] getExtensionValue(String oid)
获取扩展值 ( extnValue) 的 DER 编码 OCTET 字符串,该扩展值由传入的 oid String 标识。该 oid 字符串由一组句点分隔的非负整数集来表示。

例如:

OID(对象标识符) 扩展名
2.5.29.14 SubjectKeyIdentifier
2.5.29.15 KeyUsage
2.5.29.16 PrivateKeyUsage
2.5.29.17 SubjectAlternativeName
2.5.29.18 IssuerAlternativeName
2.5.29.19 BasicConstraints
2.5.29.30 NameConstraints
2.5.29.33 PolicyMappings
2.5.29.35 AuthorityKeyIdentifier
2.5.29.36 PolicyConstraints

参数:
oid - 该扩展的对象标识符值。
返回:
扩展值的 DER 编码的八位字节字符串,如果不存在,则返回 null。