我对Java-NSS库很感兴趣,正在阅读Sun's P11 Guide。我对以下内容感到困惑:
使用PKCS12密钥库和PKCS11密钥库有什么区别?
密钥库只是一个密钥库,是吗?它们有什么不同吗?它们可以在任何方面互换使用吗?
我对Java-NSS库很感兴趣,正在阅读Sun's P11 Guide。我对以下内容感到困惑:
使用PKCS12密钥库和PKCS11密钥库有什么区别?
密钥库只是一个密钥库,是吗?它们有什么不同吗?它们可以在任何方面互换使用吗?
PKCS#12是一种文件格式(通常称为.p12或.pfx),您可以在其中存储私钥和证书,用于转换/传输密钥和证书。如果您从浏览器导出私钥+证书,则很可能会使用该格式。
PKCS#11是一个接口,通常用于与硬件加密令牌进行通信(通常是智能卡或USB令牌,实际上是嵌入读卡器中的智能卡)。此接口具有许多操作以利用密钥和证书。一些令牌能够使用它们包含的私钥进行签名,而不使密钥能够离开设备。 该接口的目的是将处理密钥和证书的内容视为单独的实体,而无需执行PKCS#11提供的加密操作(更具体地说,是与私钥相关的操作)。
当您在NSS中使用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更加合并,如果您正在使用KeyChain作为KeyStore,则在OSX上使用KeychainStore)中加载和使用密钥和证书。
cert8.db
,可以使用一个 PKCS11
KeyStore 配置来使用 NSS 并指向该文件(严格来说这不是 PKCS#11,但在 Java 中它与之非常接近)。您还可以以不同的方式配置 PKCS11
KeyStore,以使用 PKCS#11 共享库。总的来说,KeyStore
是一个更高级别的抽象,包括任何可以存储密钥/证书或通过其使用它们的内容。确实可以使用这样的 KeyStore 进行 SSL,前提是密钥类型正确(取决于密码套件):RSA 是相当常见的。 - BrunoKeyStore
作为一个类,并不一定是一个具体的东西,而是一个可以用来与文件(JKS、P12)、令牌(PKCS#11)或其他库(KeychainStore、NSS)进行交互的实体。事实证明,NSS 的要求与 PKCS#11 消费者非常相似,因此它们被放在了一起。然后,如果需要,可以配置这些底层实体,例如指向 cert8.db
文件或使用某个智能卡槽。像 PKCS#12 文件这样的简单实体不需要进行任何此类配置。 - Brunocert8.db
的。所以它就像一个硬件令牌一样被访问,是这样吗?我理解得对吗? - Cratyluslibrary = .../libpkcs11.so
;而使用NSS时,需要指定nssLibraryDirectory = ...
。NSS并不是为了通过PKCS11来使用,但是Java的PKCS11存储类型被扩展以支持NSS以及真正的PKCS#11库。 - Bruno