Different types of keystore in Java -- Overview

  Pi Ke        2014-08-18 02:09:54       140,371        4          English  简体中文  繁体中文  ภาษาไทย  Tiếng Việt 

密钥库是存储加密密钥和证书的存储设施。它们最常用于SSL通信中,以证明服务器和客户端的身份。密钥库可以是文件或硬件设备。根据密钥库的类型,密钥库中可以存储三种类型的条目。

三种类型的条目是:

PrivateKey : 这是一种用于非对称加密的密钥。由于其敏感性,它通常受密码保护。它也可以用于签署数字签名。

Certificate : 证书包含一个公钥,可以识别证书中声明的主体。它通常用于验证服务器的身份。有时也用于在请求时识别客户端。

SecretKey : 用于对称加密的密钥条目。

根据密钥库可以存储的条目以及密钥库如何存储条目,Java中有一些不同类型的密钥库:JKS、JCEKS、PKCS12、PKCS11和DKS。您可以在Oracle的Java密码体系结构说明中找到这些密钥库的介绍。

接下来,我们将概述这些密钥库类型。

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

JCEKS,JCE密钥库(Java密码扩展密钥库)。它是JKS的超集,支持更多算法。它是Sun后来添加的增强标准。您可以在com.sun.crypto.provider.JceKeyStore中找到此文件。此密钥库的扩展名为jceks。可以放入JCEKS密钥库的条目包括私钥、密钥和证书。此密钥库通过使用三重DES加密为存储的私钥提供更强的保护。

JCEKS的提供者是SunJCE,它是在Java 1.4中引入的。因此,在Java 1.4之前,只能使用JKS。

PKCS12,这是一种标准的密钥库类型,可以在Java和其他语言中使用。您可以在sun.security.pkcs12.PKCS12KeyStore中找到此密钥库实现。它通常具有p12或pfx扩展名。您可以在此类型上存储私钥、密钥和证书。与JKS不同,PKCS12密钥库上的私钥可以在Java中提取。此类型是可移植的,并且可以与用其他语言(如C、C++或C#)编写的其他库一起操作。

目前,Java中的默认密钥库类型是JKS,即如果您在使用keytool创建密钥库时未指定-storetype,则密钥库格式将为JKS。但是,默认密钥库类型将在Java 9中更改为PKCS12,因为它与JKS相比具有增强的兼容性。您可以在$JRE/lib/security/java.security文件中检查默认密钥库类型:

PKCS11,这是一种硬件密钥库类型。它为Java库提供了一个接口,用于连接到硬件密钥库设备,例如SafeNet的Luna、nCipher或智能卡。您可以在sun.security.pkcs11.P11KeyStore中找到此实现。加载密钥库时,无需使用特定配置创建特定提供程序。此密钥库可以存储私钥、密钥和证书。加载密钥库时,条目将从密钥库中检索,然后转换为软件条目。

DKS,域密钥库是密钥库的密钥库。它抽象出一组作为单个逻辑密钥库呈现的密钥库。它本身实际上不是密钥库。这种新的密钥库类型是在Java 8中引入的。有一个新的类DomainLoadStoreParameter与DKS密切相关。

此密钥库位于sun.security.provider.DomainKeyStore.java

Windows-MY,这是Windows上的一种密钥库类型,由Windows操作系统管理。它存储用户私钥和证书,可用于执行加密操作,例如签名验证、数据加密等。由于它是一种本机密钥库,因此Java没有通用的API来访问它。Oracle提供了一个单独的API来访问Windows-MY密钥库——SunMSCAPI。此API的提供程序类是sun.security.mscapi.SunMSCAPI

BKS,BoucyCastle密钥库,是由流行的第三方Java加密库提供程序——BouncyCastle提供的密钥库格式。它类似于Oracle JDK提供的JKS。但它支持存储密钥、私钥和证书。它经常用于移动应用程序开发。

在Java中,密钥库的处理方式有几种选择。编写Java代码显然是一种选择。除此之外,JDK附带的工具也可以使用,它被称为keytool

keytool是一个命令行工具。它可以用于创建密钥库、生成密钥、导入和导出证书等。有关keytool支持的命令的完整列表,您可以参考Oracle keytool指南

如果您使用的是IBM JDK,则可以使用另一个工具,即ikeyman。ikeyman是一个GUI工具,可以提供密钥库的直观视图。密钥库中的条目。密钥和证书也可以使用ikeyman创建。它是系统管理员经常使用的工具。

以下是Java支持的每个密钥库的详细信息。

JAVA  KEYSTORE  OVERVIEW  JKS  PKCS12  JCEKS  PKCS11  DKS  BKS 

       

  RELATED


  4 COMMENTS


Zeef [Reply]@ 2014-08-21 08:49:10
Hello, I want to subscribe for this webpage to take most recent updates, therefore where can i do it please assist.
Pi Ke [Reply]@ 2014-08-21 09:56:24

Sorry we don't have subscribe function enabled now for our articles. However, you can subscribe to our RSS feed if you want at the header of our site. We will consider to add this function in the near future.

Anonymous [Reply]@ 2016-06-04 14:15:55

Very nice and complete summary. One important omission, though: BKCS (Bouncy Castle), used in Android.

Ke Pi [Reply]@ 2016-06-15 12:22:04

Yes, there are other keystore types introduced by third parties which we will not cover here. 



  RANDOM FUN

Task failed successfully