我对Java-NSS库感兴趣,而且我正在阅读Sun's P11 Guide。我对以下内容感到困惑:
使用PKCS12密钥库和PKCS11密钥库有什么区别?
密钥库只是一个密钥库,对吧?有什么不同吗?它们可以在任何方面互换使用吗?
答案 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上实现。当你加载 密钥库,您无需创建具体的特定提供程序 组态。此密钥库可以存储私钥,密钥和 证书。加载密钥库时,将检索条目 从密钥库中转换成软件条目。