模块  java.base
软件包  java.security.cert

Class CertificateFactory


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

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

    X.509的证书工厂必须返回作为java.security.cert.X509Certificate实例的java.security.cert.X509Certificate ,以及作为java.security.cert.X509CRL实例的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
        返回实现指定证书类型的证书工厂对象。

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

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

        Implementation Note:
        JDK Reference Implementation还使用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 s)
        从以下版本开始:
        1.4
      • generateCertPath

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

        public final CertPath generateCertPath​(InputStream inStream,
                                               String encoding)
                                        throws CertificateException
        生成CertPath对象,并使用从InputStream inStream中读取的数据InputStream进行初始化。 假设数据采用指定的编码。 有关标准编码名称及其格式的信息,请参阅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 - 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可能包含一系列DER编码证书,其格式为generateCertificate 此外, 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.