什么是密钥库?

2022-08-31 11:49:53

我一直在得到:

sun.security.validator.ValidatorException: PKIX path building failed: 
sun.security.provider.certpath.SunCertPathBuilderException: unable to find
valid certification path to requested target
.
.
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.
ValidatorException: PKIX path building failed: sun.security.provider.
certpath.SunCertPathBuilderException: unable to find valid certification 
path to requested target

在寻找如何解决此异常时,我遇到了我不理解的术语。简单来说,什么是密钥库?它与SSL有什么关系?Keystore


答案 1

Java中的密钥库可以指三件事,具体取决于上下文。(它们都密切相关,但略有不同。

  • 密钥库可以是存储私钥、证书和对称密钥的存储库。这通常是一个文件,但存储也可以以不同的方式处理(例如加密令牌或使用操作系统自己的机制)。

  • KeyStore 也是一个类,它是标准 API 的一部分。它本质上是一种加载、保存和通常与其中一个“物理”密钥库交互的方法,如上所述。A 也可以纯粹位于内存中,前提是您只需要应用程序的 API 抽象。KeyStore

    如何装入和处理此类实例取决于支持该实例的密钥库文件(或其他存储系统)的格式。提供多种格式。一些最常见的是JKS和PKCS#12(.p12)。KeyStore

  • “密钥库”也可以用作“信任库”的对应词。这是它可能令人困惑的地方,因为“密钥库”和“信任库”都是密钥库,它们只是用于不同的目的。您可以在此答案中找到更多详细信息。密钥库用于初始化密钥管理器,而信任库用于初始化信任管理器。来自 JSSE 参考指南

    • A 确定是否应信任远程身份验证凭据(以及连接)。TrustManager

    • 确定要发送到远程主机的身份验证凭据。KeyManager

    从本质上讲,用作信任库的密钥库将包含许多您愿意信任的 (CA) 证书:这些是您将用于验证您尚不知道和信任的远程证书的信任锚。相比之下,用作密钥库的密钥库将包含您自己的证书及其私钥:这是您将用于向远程方进行身份验证的内容(在需要时)。

    有一个与 JRE () 捆绑在一起的缺省信任库。没有默认密钥库,因为它通常是用户更明确的步骤。/lib/security/cacerts

在 SSL/TLS 的上下文中,密钥库(用作密钥库的密钥库)将是服务器存储其证书和私钥的位置(或者,当使用客户机证书认证时,客户端存储其证书和私钥的位置)。信任库(用作信任库的密钥库)将是客户端存储其愿意信任的 CA 证书的位置,以便在连接到 SSL/TLS 服务器时能够验证服务器证书(同样,在服务器端,这也是存储用于验证客户端证书的 CA 证书的位置)。

通常,当您连接到的服务器的证书无法使用您正在使用的信任库中的任何证书进行验证时,就会发生您收到的错误 (“”)。您通常需要在信任库中直接在信任库中拥有服务器证书(只能在小规模上管理),或者具有用于颁发该服务器证书的 CA 证书(或它所呈现的链中的一个证书,当存在链时)。ValidatorException: PKIX path building failed


答案 2

简单地说,要建立与SSL端点的连接,您必须信任其公共证书。要信任证书,证书本身或其颁发者的证书必须位于密钥库中。

将密钥库视为一组文件夹或包含证书的数据库/存储库。在物理上,它是 JRE 中的一个文件 ()。/lib/security/cacerts

可以使用 JRE 附带的命令修改此存储库。有关一些常用命令,请参阅此链接。另一种方法是使用 Java 控制面板的“证书”对话框(这也随 JRE 一起安装):keytool

Certificate Dialog