39

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

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

密钥库只是一个密钥库,对吗?有什么不同吗?它们可以在任何方面互换使用吗?

4

2 回答 2

56

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 中,您可能能够RSAPrivateKey从 PKCS#11 存储中获取实例,使用它来签名和解密,而永远无法从其模数中获取任何内容。处理它的安全提供者将通过库进行签名/解密(如果硬件令牌支持该库,则通过令牌)。

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

于 2011-05-27T21:10:50.617 回答
4

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

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

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

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

于 2016-10-12T16:12:21.717 回答