Module java.base

Class CertificateFactory

java.lang.Object
java.security.cert.CertificateFactory

public class CertificateFactory extends Object
此类定义了证书工厂的功能,用于从它们的编码生成证书、证书路径(CertPath)和证书吊销列表(CRL)对象。

对于由多个证书组成的编码,当您想要解析一组可能不相关的证书时,请使用generateCertificates。否则,当您想要生成一个CertPath(证书链)并随后使用CertPathValidator验证它时,请使用generateCertPath

X.509的证书工厂必须返回java.security.cert.X509Certificate的证书实例,以及java.security.cert.X509CRL的CRL实例。

以下示例读取一个包含Base64编码证书的文件,每个证书以-----BEGIN CERTIFICATE-----开头,并以-----END CERTIFICATE-----结尾。我们将FileInputStream(不支持markreset)转换为BufferedInputStream(支持这些方法),以便每次调用generateCertificate只消耗一个证书,并且输入流的读取位置定位到文件中的下一个证书:


 FileInputStream fis = new FileInputStream(filename);
 BufferedInputStream bis = new BufferedInputStream(fis);

 CertificateFactory cf = CertificateFactory.getInstance("X.509");

 while (bis.available() > 0) {
    Certificate cert = cf.generateCertificate(bis);
    System.out.println(cert.toString());
 }
 

以下示例解析存储在文件中的PKCS#7格式的证书回复,并从中提取所有证书:

 FileInputStream fis = new FileInputStream(filename);
 CertificateFactory cf = CertificateFactory.getInstance("X.509");
 Collection c = cf.generateCertificates(fis);
 Iterator i = c.iterator();
 while (i.hasNext()) {
    Certificate cert = (Certificate)i.next();
    System.out.println(cert);
 }
 

Java平台的每个实现都必须支持以下标准CertificateFactory类型:

  • X.509
以及以下标准CertPath编码:
  • PKCS7
  • PkiPath
这些类型和编码在Java安全标准算法名称规范的CertificateFactory部分CertPath Encodings部分中有描述。请查阅您的实现的发布文档,以查看是否支持任何其他类型或编码。
自版本:
1.2
参见:
  • Constructor Details

    • CertificateFactory

      protected CertificateFactory(CertificateFactorySpi certFacSpi, Provider provider, String type)
      创建给定类型的CertificateFactory对象,并将给定的提供程序实现(SPI对象)封装在其中。
      参数:
      certFacSpi - 提供程序实现。
      provider - 提供程序。
      type - 证书类型。
  • Method Details

    • getInstance

      public static final CertificateFactory getInstance(String type) throws CertificateException
      返回实现指定证书类型的证书工厂对象。

      此方法遍历注册的安全提供程序列表,从最优先的提供程序开始。返回封装了支持指定类型的第一个提供程序的CertificateFactorySpi实现的新CertificateFactory对象。

      请注意,注册的提供程序列表可以通过Security.getProviders()方法检索。

      实现注意:
      JDK参考实现另外使用jdk.security.provider.preferred Security属性来确定指定算法的首选提供程序顺序。这可能与Security.getProviders()返回的提供程序顺序不同。
      参数:
      type - 请求的证书类型的名称。有关标准证书类型的信息,请参阅Java安全标准算法名称规范中的CertificateFactory部分。
      返回:
      指定类型的证书工厂对象
      抛出:
      CertificateException - 如果没有Provider支持指定类型的CertificateFactorySpi实现
      NullPointerException - 如果typenull
      参见:
    • getInstance

      public static final CertificateFactory getInstance(String type, String provider) throws CertificateException, NoSuchProviderException
      返回指定证书类型的证书工厂对象。

      返回封装了来自指定提供程序的CertificateFactorySpi实现的新CertificateFactory对象。指定的提供程序必须在安全提供程序列表中注册。

      请注意,注册的提供程序列表可以通过Security.getProviders()方法检索。

      参数:
      type - 证书类型。有关标准证书类型的信息,请参阅Java安全标准算法名称规范中的CertificateFactory部分。
      provider - 提供程序的名称。
      返回:
      指定类型的证书工厂对象
      抛出:
      CertificateException - 如果指定提供程序中不可用指定算法的CertificateFactorySpi实现
      IllegalArgumentException - 如果提供程序名称为null或为空
      NoSuchProviderException - 如果指定提供程序未在安全提供程序列表中注册
      NullPointerException - 如果typenull
      参见:
    • getInstance

      public static final CertificateFactory getInstance(String type, Provider provider) throws CertificateException
      返回指定证书类型的证书工厂对象。

      返回封装了来自指定Provider对象的CertificateFactorySpi实现的新CertificateFactory对象。请注意,指定的Provider对象不必在提供程序列表中注册。

      参数:
      type - 证书类型。有关标准证书类型的信息,请参阅Java安全标准算法名称规范中的CertificateFactory部分。
      provider - 提供程序。
      返回:
      指定类型的证书工厂对象
      抛出:
      CertificateException - 如果指定Provider对象中不可用指定算法的CertificateFactorySpi实现
      IllegalArgumentException - 如果提供程序为null
      NullPointerException - 如果typenull
      自版本:
      1.4
      参见:
    • getProvider

      public final Provider getProvider()
      返回此证书工厂的提供程序。
      返回:
      此证书工厂的提供程序。
    • getType

      public final String getType()
      返回与此证书工厂关联的证书类型的名称。
      返回值:
      与此证书工厂关联的证书类型的名称。
    • generateCertificate

      public final Certificate generateCertificate(InputStream inStream) throws CertificateException
      生成一个证书对象,并使用从输入流inStream读取的数据进行初始化。

      为了利用此证书工厂支持的专用证书格式,返回的证书对象可以强制转换为相应的证书类。例如,如果此证书工厂实现了X.509证书,返回的证书对象可以强制转换为X509Certificate类。

      对于X.509证书的证书工厂,inStream中提供的证书必须是DER编码的,并且可以以二进制或可打印(Base64)编码提供。如果证书以Base64编码提供,必须在开头用-----BEGIN CERTIFICATE-----界定,并且在结尾用-----END CERTIFICATE-----界定。

      请注意,如果给定的输入流不支持markreset,此方法将消耗整个输入流。否则,每次调用此方法都会消耗一个证书,并且输入流的读取位置将定位到固有的证书结束标记之后的下一个可用字节。如果输入流中的数据不包含固有的证书结束标记(除了EOF)并且在解析证书后存在尾随数据,则会抛出CertificateException

      参数:
      inStream - 包含证书数据的输入流。
      返回值:
      一个使用来自输入流的数据初始化的证书对象。
      抛出:
      CertificateException - 解析错误。
    • getCertPathEncodings

      public final Iterator<String> getCertPathEncodings()
      返回此证书工厂支持的CertPath编码的迭代,首先是默认编码。有关标准编码名称及其格式的信息,请参阅Java安全标准算法名称规范中的CertPath编码部分。

      尝试通过其remove方法修改返回的Iterator会导致UnsupportedOperationException

      返回值:
      一个Iterator,用于支持的CertPath编码的名称(作为String
      自:
      1.4
    • generateCertPath

      public final CertPath generateCertPath(InputStream inStream) throws CertificateException
      生成一个CertPath对象,并使用从InputStream inStream读取的数据进行初始化。假定数据采用默认编码。默认编码的名称是由getCertPathEncodings方法返回的Iterator的第一个元素。
      参数:
      inStream - 包含数据的InputStream
      返回值:
      一个使用来自InputStream的数据初始化的CertPath
      抛出:
      CertificateException - 解码时发生异常
      自:
      1.4
    • generateCertPath

      public final CertPath generateCertPath(InputStream inStream, String encoding) throws CertificateException
      生成一个CertPath对象,并使用从InputStream inStream读取的数据进行初始化。假定数据采用指定的编码。有关标准编码名称及其格式的信息,请参阅Java安全标准算法名称规范中的CertPath编码部分。
      参数:
      inStream - 包含数据的InputStream
      encoding - 用于数据的编码
      返回值:
      一个使用来自InputStream的数据初始化的CertPath
      抛出:
      CertificateException - 解码时发生异常或请求的编码不受支持
      自:
      1.4
    • generateCertPath

      public final CertPath generateCertPath(List<? extends Certificate> certificates) throws CertificateException
      生成一个CertPath对象,并使用List中的Certificate列表进行初始化。

      提供的证书必须是CertificateFactory支持的类型。它们将从提供的List对象中复制出来。

      参数:
      certificates - 一个Certificate列表
      返回值:
      使用提供的证书列表初始化的CertPath
      抛出:
      CertificateException - 如果发生异常
      自:
      1.4
    • generateCertificates

      public final Collection<? extends Certificate> generateCertificates(InputStream inStream) throws CertificateException
      返回从给定输入流inStream读取的证书的(可能为空的)集合视图。

      为了利用此证书工厂支持的专用证书格式,返回的集合视图中的每个元素都可以强制转换为相应的证书类。例如,如果此证书工厂实现了X.509证书,返回的集合中的元素可以强制转换为X509Certificate类。

      对于X.509证书的证书工厂,inStream可能包含一系列DER编码的证书,格式如generateCertificate中描述的格式。此外,inStream可能包含一个PKCS#7证书链。这是一个PKCS#7 SignedData对象,唯一重要的字段是certificates。特别地,签名和内容将被忽略。此格式允许一次下载多个证书。如果没有证书存在,则返回一个空集合。

      请注意,如果给定的输入流不支持markreset,此方法将消耗整个输入流。

      参数:
      inStream - 包含证书的输入流。
      返回值:
      一个(可能为空的)集合视图,其中包含使用来自输入流的数据初始化的java.security.cert.Certificate对象。
      抛出:
      CertificateException - 解析错误。
    • generateCRL

      public final CRL generateCRL(InputStream inStream) throws CRLException
      生成一个证书吊销列表(CRL)对象,并使用从输入流inStream读取的数据进行初始化。

      为了利用此证书工厂支持的专用CRL格式,返回的CRL对象可以强制转换为相应的CRL类。例如,如果此证书工厂实现了X.509 CRLs,返回的CRL对象可以强制转换为X509CRL类。

      请注意,如果给定的输入流不支持markreset,此方法将消耗整个输入流。否则,每次调用此方法都会消耗一个CRL,并且输入流的读取位置将定位到固有的CRL结束标记之后的下一个可用字节。如果输入流中的数据不包含固有的CRL结束标记(除了EOF)并且在解析CRL后存在尾随数据,则会抛出CRLException

      参数:
      inStream - 包含CRL数据的输入流。
      返回值:
      使用来自输入流的数据初始化的CRL对象。
      抛出:
      CRLException - 解析错误。
    • generateCRLs

      public final Collection<? extends CRL> generateCRLs(InputStream inStream) throws CRLException
      返回从给定输入流inStream读取的CRL的(可能为空的)集合视图。

      为了利用此证书工厂支持的专用CRL格式,返回的集合视图中的每个元素都可以强制转换为相应的CRL类。例如,如果此证书工厂实现了X.509 CRLs,返回的集合中的元素可以强制转换为X509CRL类。

      对于X.509 CRLs的证书工厂,inStream可能包含一系列DER编码的CRLs。此外,inStream可能包含一个PKCS#7 CRL集。这是一个PKCS#7 SignedData对象,唯一重要的字段是crls。特别地,签名和内容将被忽略。此格式允许一次下载多个CRL。如果没有CRL存在,则返回一个空集合。

      请注意,如果给定的输入流不支持markreset,此方法将消耗整个输入流。

      参数:
      inStream - 包含CRL的输入流。
      返回值:
      一个(可能为空的)集合视图,其中包含使用来自输入流的数据初始化的java.security.cert.CRL对象。
      抛出:
      CRLException - 解析错误。