KeyStore
管理不同类型的条目。每种类型的条目都实现了KeyStore.Entry
接口。提供了三种基本的KeyStore.Entry
实现:
- KeyStore.PrivateKeyEntry
这种类型的条目保存了一个加密的
PrivateKey
,可选择以受保护的格式存储,以防止未经授权的访问。它还附带了相应公钥的证书链。私钥和证书链被给定实体用于自我认证。此身份验证的应用包括软件分发组织,它们在发布和/或许可软件时对JAR文件进行签名。
- KeyStore.SecretKeyEntry
这种类型的条目保存了一个加密的
SecretKey
,可选择以受保护的格式存储,以防止未经授权的访问。 - KeyStore.TrustedCertificateEntry
这种类型的条目包含属于另一方的单个公钥
Certificate
。它被称为受信任的证书,因为密钥库所有者相信证书中的公钥确实属于由证书的主体(所有者)标识的身份。这种类型的条目可用于验证其他方。
密钥库中的每个条目都由一个“别名”字符串标识。对于私钥及其关联的证书链,这些字符串区分实体可能进行自我认证的不同方式。例如,实体可以使用不同的证书颁发机构进行自我认证,或者使用不同的公钥算法。
别名是否区分大小写取决于实现。为避免问题,建议不要在只有大小写不同的密钥库中使用别名。
密钥库是否持久以及如果持久则密钥库使用的机制在此未指定。这允许使用各种技术来保护敏感(例如私有或秘密)密钥。智能卡或其他集成的加密引擎(SafeKeyper)是一种选择,也可以使用更简单的机制,如文件(以各种格式)。
请求KeyStore
对象的典型方式包括指定现有的密钥库文件,依赖于默认类型并提供特定的密钥库类型。
- 要指定现有的密钥库文件:
// 获取密钥库密码 char[] password = getPassword(); // 探测密钥库文件并加载密钥库条目 KeyStore ks = KeyStore.getInstance(new File("keyStoreName"), password);
系统将探测指定的文件以确定其密钥库类型,并返回一个已加载条目的密钥库实现。使用此方法时,无需调用密钥库的load
方法。 - 依赖于默认类型:
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
系统将返回默认类型的密钥库实现。 - 提供特定的密钥库类型:
KeyStore ks = KeyStore.getInstance("JKS");
系统将返回环境中可用的指定密钥库类型的最优实现。
在访问密钥库之前,必须加载
它(除非在实例化期间已加载)。
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); // 获取用户密码和文件输入流 char[] password = getPassword(); try (FileInputStream fis = new FileInputStream("keyStoreName")) { ks.load(fis, password); }使用上述
load
方法创建一个空的密钥库时,将null
作为InputStream
参数传递。
一旦密钥库已加载,就可以从密钥库中读取现有条目,或将新条目写入密钥库:
KeyStore.PasswordProtection protParam = new KeyStore.PasswordProtection(password); try (FileOutputStream fos = new FileOutputStream("newKeyStoreName")) { // 获取我的私钥 KeyStore.PrivateKeyEntry pkEntry = (KeyStore.PrivateKeyEntry) ks.getEntry("privateKeyAlias", protParam); PrivateKey myPrivateKey = pkEntry.getPrivateKey(); // 保存我的秘密密钥 javax.crypto.SecretKey mySecretKey; KeyStore.SecretKeyEntry skEntry = new KeyStore.SecretKeyEntry(mySecretKey); ks.setEntry("secretKeyAlias", skEntry, protParam); // 存储密钥库 ks.store(fos, password); } finally { protParam.destroy(); }请注意,尽管可以使用相同的密码加载密钥库,保护私钥条目,保护秘密密钥条目以及存储密钥库(如上面的示例代码所示),但也可以使用不同的密码或其他保护参数。
Java平台的每个实现都必须支持以下标准KeyStore
类型:
PKCS12
- 自版本:
- 1.2
- 参见:
-
Nested Class Summary
Modifier and TypeClassDescriptionstatic class
一个即将实例化的KeyStore
对象的描述。static class
一个封装了CallbackHandler的ProtectionParameter
。static interface
KeyStore
条目类型的标记接口。static interface
static class
ProtectionParameter
的基于密码的实现。static final class
一个包含PrivateKey
和相应证书链的KeyStore
条目。static interface
密钥库保护参数的标记接口。static final class
一个包含SecretKey
的KeyStore
条目。static final class
一个包含受信任Certificate
的KeyStore
条目。 -
Constructor Summary
ModifierConstructorDescriptionprotected
KeyStore
(KeyStoreSpi keyStoreSpi, Provider provider, String type) 创建给定类型的KeyStore
对象,并将给定提供程序实现(SPI对象)封装在其中。 -
Method Summary
Modifier and TypeMethodDescriptionfinal Enumeration
<String> aliases()
列出此密钥库的所有别名名称。final boolean
containsAlias
(String alias) 检查此密钥库中是否存在给定别名。final void
deleteEntry
(String alias) 从此密钥库中删除由给定别名标识的条目。final boolean
entryInstanceOf
(String alias, Class<? extends KeyStore.Entry> entryClass) 确定指定alias
的密钥库Entry
是否是指定entryClass
的实例或子类。final Set
<KeyStore.Entry.Attribute> getAttributes
(String alias) 检索与给定别名关联的属性。final Certificate
getCertificate
(String alias) 返回与给定别名关联的证书。final String
返回第一个证书与给定证书匹配的密钥库条目(别名)名称。final Certificate[]
getCertificateChain
(String alias) 返回与给定别名关联的证书链。final Date
getCreationDate
(String alias) 返回由给定别名标识的条目的创建日期。static final String
返回由keystore.type
安全属性指定的默认密钥库类型,如果不存在此类属性,则返回字符串“jks”(代表“Java密钥库”)。final KeyStore.Entry
getEntry
(String alias, KeyStore.ProtectionParameter protParam) 使用指定的保护参数为指定别名获取密钥库Entry
。static final KeyStore
getInstance
(File file, char[] password) 返回适当密钥库类型的已加载密钥库对象。static final KeyStore
getInstance
(File file, KeyStore.LoadStoreParameter param) 返回适当密钥库类型的已加载密钥库对象。static KeyStore
getInstance
(String type) 返回指定类型的KeyStore
对象。static KeyStore
getInstance
(String type, String provider) 返回指定类型的KeyStore
对象。static KeyStore
getInstance
(String type, Provider provider) 返回指定类型的KeyStore
对象。final Key
使用给定密码恢复与给定别名关联的密钥。final Provider
返回此密钥库的提供程序。final String
getType()
返回此密钥库的类型。final boolean
isCertificateEntry
(String alias) 如果由给定别名标识的条目是通过调用setCertificateEntry
创建的,或者通过调用setEntry
创建的,其中包含TrustedCertificateEntry
,则返回true
。final boolean
isKeyEntry
(String alias) 如果由给定别名标识的条目是通过调用setKeyEntry
创建的,或者通过调用setEntry
创建的,其中包含PrivateKeyEntry
或SecretKeyEntry
,则返回true
。final void
load
(InputStream stream, char[] password) 从给定输入流加载此密钥库。final void
load
(KeyStore.LoadStoreParameter param) 使用给定LoadStoreParameter
加载此密钥库。final void
setCertificateEntry
(String alias, Certificate cert) 将给定的受信任证书分配给给定别名。final void
setEntry
(String alias, KeyStore.Entry entry, KeyStore.ProtectionParameter protParam) 在指定别名下保存密钥库Entry
。final void
setKeyEntry
(String alias, byte[] key, Certificate[] chain) 将已经受保护的给定密钥分配给给定别名。final void
setKeyEntry
(String alias, Key key, char[] password, Certificate[] chain) 将给定密钥以给定密码保护分配给给定别名。final int
size()
检索此密钥库中的条目数。final void
store
(OutputStream stream, char[] password) 将此密钥库保存到给定输出流,并使用给定密码保护其完整性。final void
store
(KeyStore.LoadStoreParameter param) 使用给定LoadStoreParameter
保存此密钥库。
-
Constructor Details
-
KeyStore
创建给定类型的KeyStore
对象,并将给定提供程序实现(SPI对象)封装在其中。- 参数:
-
keyStoreSpi
- 提供程序实现。 -
provider
- 提供程序。 -
type
- 密钥库类型。
-
-
Method Details
-
getInstance
返回指定类型的KeyStore
对象。此方法遍历已注册的安全提供程序列表,从最优先的提供程序开始。返回一个新的
KeyStore
对象,封装了第一个支持指定类型的提供程序的KeyStoreSpi
实现。请注意,已注册提供程序列表可以通过
Security.getProviders()
方法检索。- 实现注意事项:
-
JDK参考实现还使用
jdk.security.provider.preferred
Security
属性来确定指定算法的首选提供程序顺序。这可能与由Security.getProviders()
返回的提供程序顺序不同。 - 参数:
-
type
- 密钥库的类型。有关标准密钥库类型的信息,请参阅Java安全标准算法名称规范中的KeyStore部分。 - 返回:
- 指定类型的密钥库对象
- 抛出:
-
KeyStoreException
- 如果没有提供程序支持指定类型的KeyStoreSpi
实现 -
NullPointerException
- 如果type
为null
- 参见:
-
getInstance
public static KeyStore getInstance(String type, String provider) throws KeyStoreException, NoSuchProviderException 返回指定类型的KeyStore
对象。返回一个新的
KeyStore
对象,封装了指定提供程序的KeyStoreSpi
实现。指定的提供程序必须在安全提供程序列表中注册。请注意,注册的提供程序列表可以通过
Security.getProviders()
方法检索。- 参数:
-
type
- 密钥库的类型。有关标准密钥库类型的信息,请参阅Java安全标准算法名称规范中的KeyStore部分。 -
provider
- 提供程序的名称。 - 返回:
- 指定类型的密钥库对象
- 抛出:
-
IllegalArgumentException
- 如果提供程序名称为null
或为空 -
KeyStoreException
- 如果指定提供程序中不可用指定类型的KeyStoreSpi
实现 -
NoSuchProviderException
- 如果指定提供程序未在安全提供程序列表中注册 -
NullPointerException
- 如果type
为null
- 参见:
-
getInstance
返回指定类型的KeyStore
对象。返回一个新的
KeyStore
对象,封装了指定提供程序对象的KeyStoreSpi
实现。请注意,指定的提供程序对象不必在提供程序列表中注册。- 参数:
-
type
- 密钥库的类型。有关标准密钥库类型的信息,请参阅Java安全标准算法名称规范中的KeyStore部分。 -
provider
- 提供程序。 - 返回:
- 指定类型的密钥库对象
- 抛出:
-
IllegalArgumentException
- 如果指定提供程序为null
-
KeyStoreException
- 如果指定Provider
对象中不可用指定类型的KeyStoreSpi
实现 -
NullPointerException
- 如果type
为null
- 自版本:
- 1.4
- 参见:
-
getDefaultType
返回由keystore.type
安全属性指定的默认密钥库类型,如果不存在此类属性,则返回字符串"jks"("Java密钥库"的缩写)。默认密钥库类型可供不希望在调用
getInstance
方法时使用硬编码密钥库类型,并希望在用户未指定自己的密钥库类型时提供默认密钥库类型的应用程序使用。可以通过将
keystore.type
安全属性的值设置为所需的密钥库类型来更改默认密钥库类型。- 返回:
-
由
keystore.type
安全属性指定的默认密钥库类型,如果不存在此类属性,则返回字符串"jks"。 - 参见:
-
getProvider
返回此密钥库的提供程序。- 返回:
- 此密钥库的提供程序。
-
getType
返回此密钥库的类型。- 返回:
- 此密钥库的类型。
-
getAttributes
检索与给定别名关联的属性。- 参数:
-
alias
- 别名 - 返回:
-
一个不可修改的属性
Set
。如果KeyStoreSpi
实现未覆盖KeyStoreSpi.engineGetAttributes(String)
,或给定别名不存在,或给定别名没有关联的属性,则此集合为空。对于仅在提取条目后通过KeyStore.Entry.getAttributes()
方法可用的PrivateKeyEntry
或SecretKeyEntry
条目,此集合也可能为空。 - 抛出:
-
KeyStoreException
- 如果密钥库尚未初始化(已加载)。 -
NullPointerException
- 如果alias
为null
- 自版本:
- 18
-
getKey
public final Key getKey(String alias, char[] password) throws KeyStoreException, NoSuchAlgorithmException, UnrecoverableKeyException 使用给定密码检索与给定别名关联的密钥。必须通过调用setKeyEntry
或通过调用setEntry
与PrivateKeyEntry
或SecretKeyEntry
相关联的别名来关联密钥。- 参数:
-
alias
- 别名 -
password
- 用于恢复密钥的密码 - 返回:
-
请求的密钥,如果给定别名不存在或不标识与密钥相关的条目,则返回
null
。 - 抛出:
-
KeyStoreException
- 如果密钥库尚未初始化(已加载)。 -
NoSuchAlgorithmException
- 如果找不到用于恢复密钥的算法 -
UnrecoverableKeyException
- 如果无法恢复密钥(例如,提供的密码错误)。
-
getCertificateChain
使用给定别名关联的证书链。证书链必须通过调用setKeyEntry
或通过调用setEntry
与PrivateKeyEntry
相关联的别名来关联。- 参数:
-
alias
- 别名 - 返回:
-
证书链(用户证书优先,然后是零个或多个证书颁发机构),如果给定别名不存在或不包含证书链,则返回
null
- 抛出:
-
KeyStoreException
- 如果密钥库尚未初始化(已加载)。
-
getCertificate
返回与给定别名关联的证书。如果给定别名标识通过调用
setCertificateEntry
创建的条目,或通过调用setEntry
与TrustedCertificateEntry
创建的条目,则返回该条目中包含的受信任证书。如果给定别名标识通过调用
setKeyEntry
创建的条目,或通过调用setEntry
与PrivateKeyEntry
创建的条目,则返回该条目中证书链的第一个元素。- 参数:
-
alias
- 别名 - 返回:
-
证书,如果给定别名不存在或不包含证书,则返回
null
。 - 抛出:
-
KeyStoreException
- 如果密钥库尚未初始化(已加载)。
-
getCreationDate
返回由给定别名标识的条目的创建日期。- 参数:
-
alias
- 别名 - 返回:
-
此条目的创建日期,如果给定别名不存在,则返回
null
- 抛出:
-
KeyStoreException
- 如果密钥库尚未初始化(已加载)。
-
setKeyEntry
public final void setKeyEntry(String alias, Key key, char[] password, Certificate[] chain) throws KeyStoreException 将给定密钥分配给给定别名,并使用给定密码保护它。如果给定密钥是
java.security.PrivateKey
类型,则必须附带证书链,证明相应的公钥。如果给定别名已存在,则与其关联的密钥(以及可能的证书链)将被给定密钥覆盖。
- 参数:
-
alias
- 别名 -
key
- 与别名关联的密钥 -
password
- 用于保护密钥的密码 -
chain
- 相应公钥的证书链(仅在给定密钥为java.security.PrivateKey
类型时需要)。 - 抛出:
-
KeyStoreException
- 如果密钥库尚未初始化(加载),无法保护给定密钥,或由于其他原因操作失败
-
setKeyEntry
public final void setKeyEntry(String alias, byte[] key, Certificate[] chain) throws KeyStoreException 将已经受保护的给定密钥分配给给定别名。如果受保护的密钥是
java.security.PrivateKey
类型,则必须附带证书链,证明相应的公钥。如果底层密钥库实现是jks
类型,则key
必须编码为PKCS#8标准中定义的EncryptedPrivateKeyInfo
。如果给定别名已经存在,则与其关联的密钥(以及可能的证书链)将被覆盖。
- 参数:
-
alias
- 别名 -
key
- (受保护格式的)与别名关联的密钥 -
chain
- 相应公钥的证书链(仅在受保护的密钥为java.security.PrivateKey
类型时有用)。 - 抛出:
-
KeyStoreException
- 如果密钥库尚未初始化(加载),或由于其他原因操作失败。
-
setCertificateEntry
将给定的受信任证书分配给给定别名。如果给定别名标识由调用
setCertificateEntry
创建的现有条目,或由调用setEntry
创建的TrustedCertificateEntry
,则现有条目中的受信任证书将被给定证书覆盖。- 参数:
-
alias
- 别名 -
cert
- 证书 - 抛出:
-
KeyStoreException
- 如果密钥库尚未初始化,或给定别名已经存在且不标识包含受信任证书的条目,或由于其他原因操作失败。
-
deleteEntry
从此密钥库中删除由给定别名标识的条目。- 参数:
-
alias
- 别名 - 抛出:
-
KeyStoreException
- 如果密钥库尚未初始化,或无法移除条目。
-
aliases
列出此密钥库的所有别名。- 返回:
- 别名的枚举
- 抛出:
-
KeyStoreException
- 如果密钥库尚未初始化(加载)。
-
containsAlias
检查此密钥库中是否存在给定别名。- 参数:
-
alias
- 别名 - 返回:
-
如果别名存在则返回
true
,否则返回false
- 抛出:
-
KeyStoreException
- 如果密钥库尚未初始化(加载)。
-
size
检索此密钥库中条目的数量。- 返回:
- 此密钥库中的条目数量
- 抛出:
-
KeyStoreException
- 如果密钥库尚未初始化(加载)。
-
isKeyEntry
如果由给定别名标识的条目是由调用setKeyEntry
创建的,或由调用setEntry
创建的PrivateKeyEntry
或SecretKeyEntry
,则返回true
。- 参数:
-
alias
- 要检查的密钥库条目的别名 - 返回:
-
如果由给定别名标识的条目是与密钥相关的条目,则返回
true
,否则返回false
。 - 抛出:
-
KeyStoreException
- 如果密钥库尚未初始化(加载)。
-
isCertificateEntry
如果由给定别名标识的条目是由调用setCertificateEntry
创建的,或由调用setEntry
创建的TrustedCertificateEntry
,则返回true
。- 参数:
-
alias
- 要检查的密钥库条目的别名 - 返回:
-
如果由给定别名标识的条目包含受信任的证书,则返回
true
,否则返回false
。 - 抛出:
-
KeyStoreException
- 如果密钥库尚未初始化(加载)。
-
getCertificateAlias
返回第一个证书与给定证书匹配的密钥库条目(别名)名称。此方法尝试将给定证书与每个密钥库条目进行匹配。如果正在考虑的条目是由调用
setCertificateEntry
创建的,或由调用setEntry
创建的TrustedCertificateEntry
,则将给定证书与该条目的证书进行比较。如果正在考虑的条目是由调用
setKeyEntry
创建的,或由调用setEntry
创建的PrivateKeyEntry
,则将给定证书与该条目的证书链的第一个元素进行比较。- 参数:
-
cert
- 要匹配的证书。 - 返回:
-
第一个具有匹配证书的条目的别名,如果此密钥库中不存在这样的条目则返回
null
。 - 抛出:
-
KeyStoreException
- 如果密钥库尚未初始化(加载)。
-
store
public final void store(OutputStream stream, char[] password) throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException 将此密钥库存储到给定的输出流,并使用给定密码保护其完整性。- 参数:
-
stream
- 写入此密钥库的输出流。 -
password
- 生成密钥库完整性检查的密码。如果密钥库不支持或不需要完整性检查,则可以为null
。 - 抛出:
-
KeyStoreException
- 如果密钥库尚未初始化(加载)。 -
IOException
- 如果数据存在I/O问题 -
NoSuchAlgorithmException
- 如果找不到适当的数据完整性算法 -
CertificateException
- 如果密钥库数据中包含的任何证书无法存储
-
store
public final void store(KeyStore.LoadStoreParameter param) throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException 使用给定的LoadStoreParameter
存储此密钥库。- 参数:
-
param
- 指定如何存储密钥库的LoadStoreParameter
,可以为null
- 抛出:
-
IllegalArgumentException
- 如果未识别给定的LoadStoreParameter
输入 -
KeyStoreException
- 如果密钥库尚未初始化(加载) -
IOException
- 如果数据存在I/O问题 -
NoSuchAlgorithmException
- 如果找不到适当的数据完整性算法 -
CertificateException
- 如果密钥库数据中包含的任何证书无法存储 -
UnsupportedOperationException
- 如果不支持此操作 - 自1.5起:
- 1.5
-
load
public final void load(InputStream stream, char[] password) throws IOException, NoSuchAlgorithmException, CertificateException 从给定的输入流加载此密钥库。可以提供密码以解锁密钥库(例如,密钥库位于硬件令牌设备上),或检查密钥库数据的完整性。如果未提供用于完整性检查的密码,则不执行完整性检查。
为了创建空的密钥库,或者如果密钥库无法从流初始化,则将
null
作为stream
参数传递。请注意,如果此密钥库已加载,则会重新初始化并从给定的输入流再次加载。
- 参数:
-
stream
- 加载密钥库的输入流,或null
-
password
- 用于检查密钥库完整性的密码,用于解锁密钥库的密码,或null
- 抛出:
-
IOException
- 如果密钥库数据存在I/O或格式问题,如果需要密码但未提供,或者提供的密码不正确。如果错误是由于密码错误,则IOException
的cause
应为UnrecoverableKeyException
-
NoSuchAlgorithmException
- 如果用于检查密钥库完整性的算法无法找到 -
CertificateException
- 如果无法加载密钥库中的任何证书
-
load
public final void load(KeyStore.LoadStoreParameter param) throws IOException, NoSuchAlgorithmException, CertificateException 使用给定的LoadStoreParameter
加载此密钥库。请注意,如果此
KeyStore
已加载,则会重新初始化并从给定参数再次加载。- 参数:
-
param
- 指定如何加载密钥库的LoadStoreParameter
,可以为null
- 抛出:
-
IllegalArgumentException
- 如果给定的LoadStoreParameter
输入未被识别 -
IOException
- 如果密钥库数据存在I/O或格式问题。如果错误是由于不正确的ProtectionParameter
(例如,密码错误),则IOException
的cause
应为UnrecoverableKeyException
-
NoSuchAlgorithmException
- 如果用于检查密钥库完整性的算法无法找到 -
CertificateException
- 如果密钥库中的任何证书无法加载 - 自 JDK 版本:
- 1.5
-
getEntry
public final KeyStore.Entry getEntry(String alias, KeyStore.ProtectionParameter protParam) throws NoSuchAlgorithmException, UnrecoverableEntryException, KeyStoreException 获取指定别名和指定保护参数的密钥库Entry
。- 参数:
-
alias
- 获取此别名的密钥库Entry
-
protParam
- 用于保护Entry
的ProtectionParameter
,可以为null
- 返回:
-
指定别名的密钥库
Entry
,如果不存在此条目则返回null
- 抛出:
-
NullPointerException
- 如果alias
为null
-
NoSuchAlgorithmException
- 如果找不到用于恢复条目的算法 -
UnrecoverableEntryException
- 如果指定的protParam
不足或无效 -
UnrecoverableKeyException
- 如果条目是PrivateKeyEntry
或SecretKeyEntry
,且指定的protParam
不包含恢复密钥所需的信息(例如,密码错误) -
KeyStoreException
- 如果密钥库尚未初始化(加载)。 - 自 JDK 版本:
- 1.5
- 参见:
-
setEntry
public final void setEntry(String alias, KeyStore.Entry entry, KeyStore.ProtectionParameter protParam) throws KeyStoreException 将指定别名下的密钥库Entry
保存。保护参数用于保护Entry
。如果指定别名已存在条目,则会被覆盖。
- 参数:
-
alias
- 在此别名下保存密钥库Entry
-
entry
- 要保存的Entry
-
protParam
- 用于保护Entry
的ProtectionParameter
,可以为null
- 抛出:
-
NullPointerException
- 如果alias
或entry
为null
-
KeyStoreException
- 如果密钥库尚未初始化(加载),或者由于其他原因操作失败 - 自 JDK 版本:
- 1.5
- 参见:
-
entryInstanceOf
public final boolean entryInstanceOf(String alias, Class<? extends KeyStore.Entry> entryClass) throws KeyStoreException 确定指定alias
的密钥库Entry
是否是指定entryClass
的实例或子类。- 参数:
-
alias
- 别名 -
entryClass
- 条目类 - 返回:
-
如果指定
alias
的密钥库Entry
是指定entryClass
的实例或子类,则返回true
,否则返回false
- 抛出:
-
NullPointerException
- 如果alias
或entryClass
为null
-
KeyStoreException
- 如果密钥库尚未初始化(加载) - 自 JDK 版本:
- 1.5
-
getInstance
public static final KeyStore getInstance(File file, char[] password) throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException 返回适当类型的已加载密钥库对象。首先通过探测指定文件确定密钥库类型。然后实例化密钥库对象,并使用该文件的数据加载。可以提供密码以解锁密钥库(例如,密钥库位于硬件令牌设备上)或检查密钥库数据的完整性。如果未提供密码进行完整性检查,则不执行完整性检查。
此方法遍历已注册的安全提供者列表,从最优先的提供者开始。对于每个提供者支持的
KeyStoreSpi
实现,它调用engineProbe
方法来确定是否支持指定的密钥库。返回一个新的KeyStore
对象,该对象封装了第一个支持指定文件的KeyStoreSpi
实现。请注意,已注册提供者的列表可以通过
Security.getProviders()
方法检索。- 参数:
-
file
- 密钥库文件 -
password
- 密钥库密码,可以为null
- 返回:
- 加载有密钥库数据的密钥库对象
- 抛出:
-
KeyStoreException
- 如果没有提供者支持指定密钥库文件的KeyStoreSpi
实现。 -
IOException
- 如果密钥库数据存在I/O或格式问题,如果需要密码但未提供,或者提供的密码不正确。如果错误是由于密码错误,则IOException
的cause
应为UnrecoverableKeyException
。 -
NoSuchAlgorithmException
- 如果用于检查密钥库完整性的算法无法找到。 -
CertificateException
- 如果无法加载密钥库中的任何证书。 -
IllegalArgumentException
- 如果文件不存在或不是指向普通文件。 -
NullPointerException
- 如果文件为null
。 -
SecurityException
- 如果存在安全管理器且其SecurityManager.checkRead(java.io.FileDescriptor)
方法拒绝对指定文件的读取访问。 - 自 JDK 版本:
- 9
- 参见:
-
getInstance
public static final KeyStore getInstance(File file, KeyStore.LoadStoreParameter param) throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException 返回适当类型的已加载密钥库对象。首先通过探测指定文件确定密钥库类型。然后实例化密钥库对象,并使用该文件的数据加载。可以提供LoadStoreParameter
,该参数指定如何解锁密钥库数据或执行完整性检查。此方法遍历已注册的安全提供者列表,从最优先的提供者开始。对于每个提供者支持的
KeyStoreSpi
实现,它调用engineProbe
方法来确定是否支持指定的密钥库。返回一个新的KeyStore
对象,该对象封装了第一个支持指定文件的KeyStoreSpi
实现。请注意,已注册提供者的列表可以通过
Security.getProviders()
方法检索。- 参数:
-
file
- 密钥库文件 -
param
- 指定如何加载密钥库的LoadStoreParameter
,可以为null
- 返回值:
- 包含密钥库数据的密钥库对象
- 抛出:
-
KeyStoreException
- 如果没有提供者支持为指定的密钥库文件实现KeyStoreSpi
-
IOException
- 如果密钥库数据存在I/O或格式问题。如果错误是由于不正确的ProtectionParameter
(例如,密码错误),则IOException
的cause
应为UnrecoverableKeyException
-
NoSuchAlgorithmException
- 如果用于检查密钥库完整性的算法找不到 -
CertificateException
- 如果无法加载密钥库中的任何证书 -
IllegalArgumentException
- 如果文件不存在或不是普通文件,或者如果未识别param -
NullPointerException
- 如果文件为null
-
SecurityException
- 如果存在安全管理器并且其SecurityManager.checkRead(java.io.FileDescriptor)
方法拒绝对指定文件的读取访问 - 自 JDK 版本:
- 9
- 参见:
-