Java中的Keystore可以参考三件事情,具体取决于上下文。 (他们都是密切相关的,但微妙的不同)
>密钥库可以是可以存储私钥,证书和对称密钥的存储库。这通常是一个文件,但也可以以不同的方式处理存储(例如密码令牌或使用操作系统自己的机制)。
> KeyStore也是标准API的一部分。它本质上是一种加载,保存和通常与上述“物理”密钥库之一进行交互的方式。如果您只需要应用程序的API抽象,KeyStore也可以纯粹在内存中。
如何加载和处理这样的KeyStore实例取决于支持它的密钥库文件(或其他存储系统)的格式。 Multiple formats可用。一些最常见的是JKS和PKCS#12(.p12)。
>“keystore”也可以作为“信托市场”的对应。这是可以让人困惑的地方,因为“keystore”和“truststore”都是密钥库,它们只是用于不同的目的。您可以在this answer找到更多详细信息。密钥库用于初始化密钥管理器,而信任库用于初始化信任管理器。从JSSE reference guide:
A TrustManager determines whether the remote authentication
credentials (and thus the connection) should be trusted.
A KeyManager determines which authentication credentials to send
to the remote host.
基本上,用作信任库的密钥库将包含一些您愿意信任的(CA)证书:这些证书是您将用于验证您不知道并且信任的远程证书的信任锚点。相比之下,用作密钥库的密钥库将包含您自己的证书及其私钥:这是您将要用于向远程方(如果需要)验证您的身份。
存在与JRE(/ lib / security / cacerts)捆绑在一起的默认信任库。没有默认的密钥库,因为用户通常是一个更明确的步骤。
在SSL / TLS的上下文中,密钥库(用作密钥库的密钥库)将是服务器存储其证书和私钥(或使用客户端证书身份验证时,客户端存储其证书和私钥的位置)。信任库(用作信任库的密钥库)将是客户端存储其愿意信任的CA的CA证书的位置,以便能够在与SSL / TLS服务器建立连接时验证服务器证书(同样,在服务器端,这也是用于验证客户端证书的CA证书的存储位置)。
通常,当您正在连接的服务器的证书无法使用您正在使用的信任库中的任何证书进行验证时,您将收到的错误(“ValidatorException:PKIX路径构建失败”)会发生。您通常需要在信任库中直接在您的信任库中(仅在小规模上可管理)的服务器证书或用于发出该服务器证书的CA的CA证书(或链中的其中一个证书)当有链时)。