PKCS12 密钥库和 PKCS11 密钥库之间有什么区别?

2022-09-01 03:48:17

我对Java-NSS库很感兴趣,我正在阅读Sun的P11指南。我对以下内容感到困惑:

使用 PKCS12 密钥库和 PKCS11 密钥库之间有什么区别?

密钥库只是一个密钥库,对吧?有区别吗?它们可以在任何方面互换使用吗?


答案 1

PKCS#12 是一种文件格式(通常称为 .p12 或 .pfx),您可以在其中存储私钥和证书。它主要用于转换/传输密钥和证书。如果您从浏览器中导出私钥 +证书,则它可能会采用该格式。

PKCS#11 是一个接口,通常用于与硬件加密令牌(通常是智能卡或 USB 令牌,它们实际上是嵌入在读卡器中的智能卡)进行通信。此接口具有许多操作来使用密钥和证书。某些令牌能够使用它们包含的私钥进行签名,而密钥无法离开设备。此接口的要点是将处理密钥和证书的内容视为单独的实体,而不必执行 PKCS#11 提供的加密操作(更具体地说,与私钥相关的操作)。

当您将 PKCS#11 与 NSS 一起使用时,您实际上是将 NSS 用作包裹在 PKCS#11 层后面的黑匣子(它实际上是 PKCS#11 硬件令牌的软件提供商)。Java通过PKCS#11使用NSS的方式略有不同,因为它不需要PKCS#11共享库(与其他PKCS#11库相比),因此,严格来说,它不是PKCS#11,尽管它非常相似。

在Java中,您可以从PKCS#11商店中获取实例,使用它进行签名和破译,而无法从其模数中获取任何内容。处理它的安全提供程序将通过库(如果硬件令牌支持该库,则通过令牌)执行签名/解密。RSAPrivateKey

回到Java中,它是一个API,可以允许您从文件(您可以获得各种文件格式,例如JKS,PKCS#12,PEM,具体取决于您的安全提供程序)或其他底层API(例如PKCS#11,或多或少与Sun提供程序中的NSS合并)加载和使用密钥和证书, 或钥匙串Store(如果您使用的是OSX并希望将钥匙串用作钥匙库)。KeyStore


答案 2

Java中不同类型的密钥库来看 -- 概述,PKCS12和PKCS11之间的差异可以描述如下

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

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

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