我对Java NSS库很感兴趣,正在阅读Sun的P11指南。我对以下内容感到困惑:
使用PKCS12密钥库和PKCS11密钥库有什么区别?
密钥库就是密钥库,对吧?有什么不同吗?它们在任何方面都可以互换使用吗?
PKCS#12是一种文件格式(通常称为.p12或.pfx),您可以在其中存储私钥和证书。它主要用于转换/传输密钥和证书。如果你从浏览器导出私钥+证书,它很可能是那种格式。
PKCS#11是一个接口,通常用于与硬件加密令牌(通常是智能卡或USB令牌,实际上是嵌入读取器中的智能卡)进行通信。这个接口有许多操作来使用密钥和证书。一些令牌可以使用其包含的私钥进行签名,而密钥无法离开设备。这个接口的目的是将处理密钥和证书的内容视为一个单独的实体,而不必执行PKCS#11提供的加密操作(更具体地说,与私钥相关的操作)。
当您将PKCS#11与NSS一起使用时,您实际上是在将NSS作为一个包裹在PKCS#12层后面的黑盒来使用(它实际上是PKCS#13硬件令牌的软件提供商)。Java通过PKCS#11使用NSS的方式略有不同,因为它不需要PKCS#12共享库(与其他PKCS#13库相比),因此,严格来说它不是PKCS#14,尽管它非常相似。
在Java中,您可以从PKCS#11存储中获取RSAPrivateKey
实例,使用它进行签名和解密,而无需从其模数中获取任何信息。处理它的安全提供者将通过库(因此,如果硬件令牌支持该库,则通过令牌)进行签名/解密。
回到Java中的KeyStore
,它是一个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,即密钥库如果在创建时未指定-storetype,则格式将为JKS带有keytool的密钥库。但是,默认的密钥存储类型将是在Java 9中更改为PKCS12,因为它增强了兼容性与JKS相比。您可以在$JRE/lib/security/java.security文件:
PKCS11,这是一种硬件密钥存储类型。它为Java库,用于连接硬件密钥库设备,例如SafeNet的Luna、nCipher或智能卡。你可以找到这个在sun.security.pkcs11.P11KeyStore中实现密钥存储,您不需要创建具有特定配置此密钥库可以存储私钥、密钥和证书。加载密钥库时,将检索条目然后转换为软件条目。