密钥库类型:使用哪一个?

时间:2012-07-18 08:04:32

标签: java security ssl jsse

通过查看java.security的文件JRE,我发现默认情况下要使用的密钥库类型设置为JKSHere,有一个可以使用的密钥库类型列表。

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

4 个答案:

答案 0 :(得分:124)

除了您链接到的标准名称列表中列出的类型之外,还有其他几种类型。您可以在cryptographic providers documentation中找到更多信息。最常见的是JKS(默认)和PKCS12(对于PKCS#12文件,通常包含.p12或有时.pfx。)

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

如果您已经拥有PKCS#12文件,则直接使用PKCS12类型通常会更容易。可以转换格式,但如果您可以直接选择密钥库类型,则很少需要。

在Java 7中,PKCS12主要用作密钥库,但 truststore (参见difference between a keystore and a truststore)则更少,因为你不能不存储私钥的证书条目。相反,JKS不要求每个条目都是私钥条目,因此您可以拥有仅包含证书的条目,这对于信任存储非常有用,您可以在其中存储您信任的证书列表(但是您没有他们的私钥)。

这在Java 8中已经发生了变化,因此您现在也可以在PKCS12商店中拥有仅限证书的条目。 (有关这些更改和进一步计划的更多详细信息,请参阅JEP 229: Create PKCS12 Keystores by Default。)

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

  • PKCS11,对于PKCS#11库,通常用于访问硬件加密令牌,但Sun提供程序实现也支持NSS存储(来自Mozilla)。
  • BKS,使用BouncyCastle提供程序(通常用于Android)。
  • Windows-MY / Windows-ROOT,如果您想直接访问Windows证书存储区。
  • KeychainStore,如果您想直接使用OSX钥匙串。

答案 1 :(得分:20)

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

以下是帖子中不同密钥库的描述:

  

JKS,Java Key Store。你可以在这里找到这个文件   sun.security.provider.JavaKeyStore。这个密钥库是Java特有的   通常有jks的扩展名。这种类型的密钥库可以包含   私钥和证书,但它不能用于存储密钥   键。由于它是Java特定的密钥库,因此无法使用   其他编程语言。

     

JCEKS,JCE密钥库。你可以在这里找到这个文件   com.sun.crypto.provider.JceKeyStore。此密钥库的扩展名为   JCEKS。可以放入JCEKS密钥库的条目是私有的   钥匙,密钥和证书。

     

PKCS12,这是一种标准的密钥库类型,可以在Java和Java中使用   其他语言。您可以在此处找到此密钥库实现   sun.security.pkcs12.PKCS12KeyStore。它通常具有p12的扩展名   或者pfx。您可以存储私钥,密钥和证书   这种类型。

     

PKCS11,这是一种硬件密钥库类型。它为服务器提供服务   用于连接硬件密钥库设备的Java库   Luna,nCipher。你可以在这里找到这个实现   sun.security.pkcs11.P11KeyStore。加载密钥库时,没有   需要创建具有特定配置的特定提供程序。这个   密钥库可以存储私钥,密钥和证书。什么时候   加载密钥库,将从密钥库中检索条目   然后转换成软件条目。

答案 2 :(得分:2)

如果您使用的是Java 8或更高版本,则绝对应该选择PKCS12,这是Java 9(JEP 229)之后的默认值。

JKSJCEKS相比,优势是:

  • 可以存储秘密密钥,私钥和证书
  • PKCS12是一种标准格式,可以由其他程序和库读取。 1
  • 改进的安全性:JKSJCEKS相当不安全。可以通过暴力破解这些密钥库类型的密码的工具的数量来看出这一点,在Android开发人员中尤其如此。 2,3

1 JDK-8202837,已在Java 11中修复

2 所有密钥库类型(包括PKCS12)使用的PBE的迭代计数过去通常是一周(CVE-2017-10356),但是在9.0.1,8u151, 7u161和6u171

3 供进一步阅读:

答案 3 :(得分:0)

Java 11 提供以下类型的 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