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

时间:2011-05-27 20:49:27

标签: java security pkcs#11 nss pkcs12

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

  

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

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

2 个答案:

答案 0 :(得分:47)

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

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

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

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

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

答案 1 :(得分:3)

Different types of keystore in Java -- Overview开始,PKCS12和PKCS11之间的差异可以描述如下

  

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

     

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

     

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