Module  java.base
软件包  java.security.cert

Class CertificateFactory



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

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

    对于X.509证书工厂必须返回是一个实例证明java.security.cert.X509Certificate这是一个实例,和CRL java.security.cert.X509CRL

    以下示例读取具有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 sectionCertPath Encodings section中进行了描述。 请参阅实施的发行文档,以查看是否支持其他类型或编码。
    从以下版本开始:
    1.2
    另请参见:
    CertificateX509CertificateCertPathCRLX509CRL
    • 构造方法详细信息

      • CertificateFactory

        protected CertificateFactory​(CertificateFactorySpi certFacSpi,
                                     Provider provider,
                                     String type)
        创建给定类型的CertificateFactory对象,并将给定的提供者实现(SPI对象)封装在其中。
        参数
        certFacSpi - 提供商实现。
        provider - 提供商。
        type - 证书类型。
    • 方法详细信息

      • getInstance

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

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

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

        Implementation Note:
        JDK参考实现另外使用jdk.security.provider.preferred Security属性来确定指定算法的首选提供者顺序。 这可能与Security.getProviders()返回的提供商的顺序不同。
        参数
        type - 请求的证书类型的名称。 有关标准证书类型的信息,请参阅Java Security Standard Algorithm Names Specification中的CertificateFactory部分。
        结果
        指定类型的证书工厂对象
        异常
        CertificateException - 如果否 Provider支持指定类型的 CertificateFactorySpi实现
        NullPointerException - 如果 typenull
        另请参见:
        Provider
      • 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 Security Standard Algorithm Names Specification中的CertPath编码部分。

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

        结果
        一个 Iterator的支持的 CertPath编码的名称(作为 String
        从以下版本开始:
        1.4
      • generateCertPath

        public final CertPath generateCertPath​(InputStream inStream)
                                        throws CertificateException
        生成一个CertPath对象,并使用从InputStream inStream读取的数据进行初始化。 数据假定为默认编码。 默认编码的名称是的第一个元素Iterator由返回getCertPathEncodings方法。
        参数
        inStream - 包含数据的 InputStream
        结果
        一个 CertPath从与所述数据初始化 InputStream
        异常
        CertificateException - 解码时是否发生异常
        从以下版本开始:
        1.4
      • generateCertPath

        public final CertPath generateCertPath​(InputStream inStream,
                                               String encoding)
                                        throws CertificateException
        生成一个CertPath对象,并使用从InputStream inStream读取的数据进行初始化。 数据假定为指定的编码。 有关标准编码名称及其格式的信息,请参阅Java Security Standard Algorithm Names Specification中的CertPath编码部分。
        参数
        inStream - 包含数据的 InputStream
        encoding - 用于数据的编码
        结果
        一个 CertPath初始化的数据来自 InputStream
        异常
        CertificateException - 如果在解码或请求的编码不支持时发生异常
        从以下版本开始:
        1.4
      • generateCertPath

        public final CertPath generateCertPath​(List<? extends Certificate> certificates)
                                        throws CertificateException
        生成一个CertPath对象,并使用ListCertificate初始化它。

        提供的证书必须是CertificateFactory支持的类型。 他们将被拷贝出来的List对象。

        参数
        certificates - a List of Certificate s
        结果
        一个 CertPath用提供的证书列表初始化
        异常
        CertificateException - 如果发生异常
        从以下版本开始:
        1.4
      • generateCertificates

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

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

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

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

        参数
        inStream - 具有证书的输入流。
        结果
        使用来自输入流的数据初始化的java.security.cert.Certificate对象的(可能为空的)集合视图。
        异常
        CertificateException - 解析错误。
      • generateCRL

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

        为了利用此证书工厂支持的专用CRL格式,返回的CRL对象可以类型转换为相应的CRL类。 例如,如果此证书工厂实现X.509 CRL,则返回的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 CRL,则返回的集合中的元素可以类型为X509CRL类。

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

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

        参数
        inStream - 具有CRL的输入流。
        结果
        使用来自输入流的数据初始化的java.security.cert.CRL对象的(可能为空的)集合视图。
        异常
        CRLException - on parsing errors.