通过查看java.security
my的文件JRE
,我看到默认使用的密钥库类型设置为JKS
. 在这里,有一个可以使用的密钥库类型的列表。
有推荐的密钥库类型吗?不同密钥库类型的优缺点是什么?
除了您链接到的标准名称列表中列出的类型之外,还有更多类型。您可以在密码提供程序文档中找到更多信息。最常见的当然是JKS
(默认)和PKCS12
(对于 PKCS#12 文件,通常带有扩展名.p12
或有时带有.pfx
)。
如果您留在 Java 世界中,JKS 是最常见的。PKCS#12 不是 Java 特定的,使用从浏览器备份的证书(带有私钥)或来自基于 OpenSSL 的工具(keytool
在 Java 6 之前无法转换密钥库和导入其私钥)特别方便,所以你必须使用其他工具)。
如果您已经有一个 PKCS#12 文件,直接使用该PKCS12
类型通常更容易。可以转换格式,但如果您可以直接选择密钥库类型,则很少需要。
在 Java 7 中,PKCS12
主要用作密钥库,但较少用于信任库(请参阅密钥库和信任库之间的区别),因为没有私钥就无法存储证书条目。相反,JKS
不要求每个条目都是私钥条目,因此您可以拥有仅包含证书的条目,这对于存储您信任的证书列表的信任存储很有用(但您没有他们的私钥)。
这在 Java 8 中发生了变化,因此您现在也可以在PKCS12
商店中拥有仅限证书的条目。(有关这些更改和进一步计划的更多详细信息,请参阅JEP 229:默认创建 PKCS12 密钥库。)
还有一些其他的密钥库类型,可能不太常用(取决于上下文),包括:
PKCS11
,对于 PKCS#11 库,通常用于访问硬件加密令牌,但 Sun 提供程序实现也通过此支持 NSS 存储(来自 Mozilla)。BKS
,使用 BouncyCastle 提供程序(通常用于 Android)。Windows-MY
/ Windows-ROOT
,如果您想直接访问 Windows 证书存储。KeychainStore
, 如果你想直接使用 OSX 钥匙串。这是一篇介绍 Java 中不同类型的 keystore 以及不同类型的 keystore 之间的差异的帖子。http://www.pixelstech.net/article/1408345768-Different-types-of-keystore-in-Java----概览
以下是帖子中不同密钥库的描述:
JKS,Java 密钥库。您可以在 sun.security.provider.JavaKeyStore 找到此文件。此密钥库是 Java 特定的,它通常具有 jks 的扩展名。这种类型的密钥库可以包含私钥和证书,但不能用于存储密钥。由于它是 Java 特定的密钥库,因此不能在其他编程语言中使用。
JCEKS,JCE 密钥库。您可以在 com.sun.crypto.provider.JceKeyStore 找到此文件。此密钥库具有 jceks 的扩展。可以放入 JCEKS 密钥库的条目是私钥、密钥和证书。
PKCS12,这是一种标准的密钥库类型,可用于 Java 和其他语言。您可以在 sun.security.pkcs12.PKCS12KeyStore 找到此密钥库实现。它通常具有 p12 或 pfx 的扩展名。您可以在此类型上存储私钥、密钥和证书。
PKCS11,这是一种硬件密钥库类型。它为 Java 库提供一个接口,以便与 Luna、nCipher 等硬件密钥库设备连接。你可以在 sun.security.pkcs11.P11KeyStore 找到这个实现。加载密钥库时,您无需创建具有特定配置的特定提供程序。该密钥库可以存储私钥、密钥和证书。加载密钥库时,将从密钥库中检索条目,然后将其转换为软件条目。
如果您使用的是 Java 8 或更新版本,您绝对应该选择Java 9 ( JEP 229PKCS12
)以来的默认值。
JKS
与和相比的优点JCEKS
是:
PKCS12
是一种标准格式,可以被其他程序和库读取1JKS
并且JCEKS
非常不安全。从这些密钥库类型的暴力破解密码工具的数量可以看出这一点,在 Android 开发人员中尤其流行。2、31有JDK-8202837,已在 Java 11 中修复
2所有密钥库类型(包括 PKCS12)使用的 PBE 的迭代次数过去相当弱(CVE-2017-10356),但是这已在 9.0.1、8u151、7u161 和 6u171 中得到修复
3进一步阅读:
Java 11 提供了以下类型的KeyStore
s:
jceks
:SunJCE 提供者提供的专有密钥库实现。
jks
:由 SUN 提供者提供的专有密钥库实现。
dks
:域密钥库是作为单个逻辑密钥库呈现的密钥库的集合。它由配置数据指定,其语法在 DomainLoadStoreParameter 类中描述。
pkcs11
:由 PKCS #11 令牌支持的密钥库。
pkcs12
:PKCS #12 中定义的个人身份信息的传输语法。
来源:https ://docs.oracle.com/en/java/javase/11/docs/specs/security/standard-names.html#keystore-types