- java.lang.Object
-
- java.security.cert.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
(不支持mark
和reset
)转换为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
- 从以下版本开始:
- 1.2
- 另请参见:
-
Certificate
,X509Certificate
,CertPath
,CRL
,X509CRL
-
-
-
构造方法摘要
构造方法 变量 构造器 描述 protected
CertificateFactory(CertificateFactorySpi certFacSpi, Provider provider, String type)
创建给定类型的CertificateFactory对象,并在其中封装给定的提供程序实现(SPI对象)。
-
方法摘要
所有方法 静态方法 实例方法 具体的方法 变量和类型 方法 描述 Certificate
generateCertificate(InputStream inStream)
生成证书对象并使用从输入流inStream
读取的数据对其进行初始化。Collection<? extends Certificate>
generateCertificates(InputStream inStream)
返回从给定输入流inStream
读取的证书的(可能为空)集合视图。CertPath
generateCertPath(InputStream inStream)
生成CertPath
对象,并使用从InputStream
inStream中读取的数据InputStream
进行初始化。CertPath
generateCertPath(InputStream inStream, String encoding)
生成CertPath
对象,并使用从InputStream
inStream中读取的数据InputStream
进行初始化。CertPath
generateCertPath(List<? extends Certificate> certificates)
生成CertPath
对象并使用List
的Certificate
初始化。CRL
generateCRL(InputStream inStream)
生成证书吊销列表(CRL)对象,并使用从输入流inStream
读取的数据对其进行初始化。Collection<? extends CRL>
generateCRLs(InputStream inStream)
返回从给定输入流inStream
读取的CRL的(可能为空)集合视图。Iterator<String>
getCertPathEncodings()
返回此证书工厂支持的CertPath
编码的迭代,首先使用默认编码。static CertificateFactory
getInstance(String type)
返回实现指定证书类型的证书工厂对象。static CertificateFactory
getInstance(String type, String provider)
返回指定证书类型的证书工厂对象。static CertificateFactory
getInstance(String type, Provider provider)
返回指定证书类型的证书工厂对象。Provider
getProvider()
返回此证书工厂的提供者。String
getType()
返回与此证书工厂关联的证书类型的名称。
-
-
-
构造方法详细信息
-
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
- 如果type
是null
- 另请参见:
-
Provider
-
getInstance
public static final CertificateFactory getInstance(String type, String provider) throws CertificateException, NoSuchProviderException
返回指定证书类型的证书工厂对象。将返回一个新的CertificateFactory对象,该对象封装了指定提供程序的CertificateFactorySpi实现。 必须在安全提供程序列表中注册指定的提供程序。
请注意,可以通过
Security.getProviders()
方法检索已注册提供商的列表。- 参数
-
type
- 证书类型。 有关标准证书类型的信息,请参阅Java Security Standard Algorithm Names Specification中的CertificateFactory部分。 -
provider
- 提供者的名称。 - 结果
- 指定类型的证书工厂对象
- 异常
-
CertificateException
- 如果指定提供程序的指定算法的CertificateFactorySpi
实现不可用 -
IllegalArgumentException
- 如果提供程序名称为null
或为空 -
NoSuchProviderException
- 如果指定的提供程序未在安全提供程序列表中注册 -
NullPointerException
- 如果type
是null
- 另请参见:
-
Provider
-
getInstance
public static final CertificateFactory getInstance(String type, Provider provider) throws CertificateException
返回指定证书类型的证书工厂对象。将返回一个新的CertificateFactory对象,该对象封装了指定Provider对象的CertificateFactorySpi实现。 请注意,指定的Provider对象不必在提供程序列表中注册。
- 参数
-
type
- 证书类型。 有关标准证书类型的信息,请参阅Java Security Standard Algorithm Names Specification中的CertificateFactory部分。 -
provider
- 提供者。 - 结果
- 指定类型的证书工厂对象
- 异常
-
CertificateException
- 如果指定的算法的CertificateFactorySpi
实现不可用于指定的Provider
对象 -
IllegalArgumentException
- 如果provider
是null
-
NullPointerException
- 如果type
是null
- 从以下版本开始:
- 1.4
- 另请参见:
-
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 -----限制----- 。请注意,如果给定的输入流不支持
mark
和reset
,则此方法将使用整个输入流。 否则,对此方法的每次调用都会占用一个证书,并且输入流的读取位置将定位到固有的证书结束标记之后的下一个可用字节。 如果输入流中的数据不包含固有的证书结束标记(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
对象并使用List
(Certificate
对其进行初始化。提供的证书必须是
CertificateFactory
支持的类型。 它们将从提供的List
对象中复制出来。- 参数
-
certificates
-List
ofCertificate
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对象,唯一重要的字段是证书 。 特别是,签名和内容被忽略。 此格式允许一次下载多个证书。 如果没有证书,则返回空集合。- 参数
-
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
类。请注意,如果给定的输入流不支持
mark
和reset
,则此方法将使用整个输入流。 否则,对此方法的每次调用都会消耗一个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,则返回空集合。- 参数
-
inStream
- 具有CRL的输入流。 - 结果
- 使用输入流中的数据初始化的java.security.cert.CRL对象的(可能为空)集合视图。
- 异常
-
CRLException
- on parsing errors.
-
-