密钥库是存储加密密钥和证书的存储设施。它们最常用于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支持的每个密钥库的详细信息。