Bru*_*uno 49
PKCS#12是一种文件格式(通常称为.p12或.pfx),您可以在其中存储私钥和证书.它主要用于转换/传输密钥和证书.如果从浏览器导出私钥+证书,则可能采用该格式.
PKCS#11是一个接口,通常用于与硬件加密令牌通信(通常是智能卡或USB令牌,实际上是嵌入在阅读器中的智能卡).此接口具有许多操作以使用密钥和证书.一些令牌能够使用它们包含的私钥进行签名,而密钥不能离开设备.此接口的要点是将处理密钥和证书的内容视为单独的实体,而不必执行PKCS#11提供的加密操作(更具体地说,与私钥相关的操作).
当您使用PKS#11和NSS时,您实际上将NSS用作包裹在PKCS#11层后面的黑盒子(它实际上是PKCS#11硬件令牌的软件提供者).Java通过PKCS#11使用NSS的方式略有不同,因为它不需要PKCS#11共享库(与其他PKCS#11库相比),因此,严格来说,它不是PKCS#11,虽然它非常相似.
在Java中,您可以RSAPrivateKey
从PKCS#11商店获取实例,使用它来签名和解密,而无法从其模数中获得任何内容.处理它的安全提供程序将通过库进行签名/解密(因此,如果该库由硬件令牌支持,则通过令牌).
回到KeyStore
Java中,它是一个API,允许您从文件加载和使用密钥和证书(您可以获得各种文件格式,如JKS,PKCS#12,PEM,具体取决于您的安全提供程序)或其他底层API (例如PKCS#11,或多或少与Sun提供程序中的NSS合并,或者如果您使用的是OSX并且想要将KeyChain用作KeyStore,则与KeychainStore合并).
从Java中不同类型的密钥库 - 概述中,PKCS12和PKCS11之间的差异可以描述如下
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 找到此实现。加载密钥库时,无需创建具有特定配置的特定提供程序。该密钥库可以存储私钥、秘密密钥和证书。加载密钥库时,将从密钥库中检索条目,然后将其转换为软件条目。