密钥存储类型: 使用哪一个?

通过查看 JREjava.security文件,我发现默认情况下要使用的密钥存储库类型被设置为 JKS给你,有一个可以使用的密钥存储库类型的列表。

是否有推荐的密钥存储库类型? 不同的密钥存储库类型的优缺点是什么?

230550 次浏览

除了您链接到的标准名称列表中列出的类型之外,还有几种类型。你可以在 加密提供程序文档中找到更多。最常见的当然是 JKS(默认值)和 PKCS12(对于 PKCS # 12文件,通常带有扩展名 .p12或有时是 .pfx)。

如果您停留在 Java 世界中,JKS 是最常见的。PKCS # 12不是 Java 特有的,使用从浏览器备份的证书(带有私钥)或基于 OpenSSL 的工具(keytool在 Java 6之前不能转换密钥存储库并导入其私钥,所以你必须使用其他工具)特别方便。

如果您已经有一个 PKCS # 12文件,那么直接使用 PKCS12类型通常会更容易。转换格式是可能的,但是如果您可以直接选择密钥存储库类型,那么很少有必要这样做。

在 Java7中,PKCS12主要作为 钥匙店使用,但对于 信托商店(参见 密钥存储库和信任存储库之间的区别)使用较少,因为没有私钥就无法存储证书条目。相比之下,JKS并不要求每个条目都是私钥条目,因此您可以拥有只包含证书的条目,这对于信任存储区非常有用,在信任存储区中存储您信任的证书列表(但是您没有用于它们的私钥)。

这在 Java8中已经改变了,所以现在您也可以在 PKCS12存储中使用只有证书的条目。(更多关于这些变化的细节和进一步的计划可以在 JEP 229: 默认情况下创建 PKCS12密钥存储库中找到。)

还有一些其他的密钥库类型,可能不太常用(取决于上下文) ,其中包括:

  • PKCS11,用于 PKCS # 11库,通常用于访问硬件加密令牌,但 Sun 提供商的实现也通过这种方式支持 NSS 存储(来自 Mozilla)。
  • BKS,使用 BouncyCastle 提供程序(通常用于 Android)。
  • 如果要直接访问 Windows 证书存储,请使用 Windows-MY/Windows-ROOT
  • KeychainStore,如果你想直接使用 OSX 密钥链。

这篇文章介绍了 Java 中不同类型的密钥存储库以及不同类型密钥存储库之间的区别。http://www.pixelstech.net/article/1408345768-Different-types-of-keystore-in-Java----Overview

下面是对邮件中不同密钥存储库的描述:

JKS,Java 密钥存储。您可以在以下地址找到这个文件 这个密钥存储库是特定于 Java 的 通常有一个扩展 jks。这种类型的密钥存储库可以包含 私钥和证书,但不能用于存储秘密 因为它是 Java 特定的密钥存储库,所以不能在 其他编程语言。

JCEKS JCE 密钥店你可以在 这个密钥存储库的扩展名为 可以放在 JCEKS 密钥存储库中的条目是私有的 密钥、密钥和证书。

PKCS12,这是一个标准的密钥存储库类型,可以在 Java 和 您可以在以下网址找到这个密钥存储实现 PKCS12KeyStore 通常有一个 p12的扩展名 您可以将私钥、秘钥和证书存储在 这种。

PKCS11,这是一个硬件密钥存储库类型 Java 库连接到硬件密钥存储设备,如 Luna,nCipher Pkcs11.P11KeyStore 需要创建具有特定配置的特定提供程序 密钥存储库可以存储私人密钥、秘密密钥和证书 加载密钥存储库时,将从密钥存储库中检索条目 然后转换成软件条目。

如果您正在使用 Java8或更新的版本,那么您一定要选择自 Java9(JEP 229)以来的默认 PKCS12

JKSJCEKS相比的优势是:

  • 可以存储秘钥、私钥和证书
  • PKCS12是一种标准格式,它可以被其他程序和库 1读取
  • 改进的安全性: JKSJCEKS非常不安全。这可以从这些密钥库类型的强制密码工具的数量上看出来,特别是在 Android 开发人员中流行

有一个 JDK-8202837,它已经在 Java11中被修复了

2 所有密钥库类型(包括 PKCS12)使用的 PBE 的迭代计数过去相当弱(CVE-2017-10356) ,但是在9.0.1,8u151,7u161和6u171中已经固定

3 进一步阅读:

Java11提供以下类型的 KeyStore:

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