什么是Keystore?

时间:2014-04-21 17:06:44

标签: java ssl keystore

我一直在:

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

在搜索如何解决此异常时,我遇到了一些我不理解的术语Keystore。 Keystore简单来说是什么?它与SSL的关系如何?

3 个答案:

答案 0 :(得分:114)

Java中的

Keystore 可以参考三件事,具体取决于上下文。 (他们所有人都密切相关但略有不同。)

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

  • KeyStore也是一个标准API的一部分。它本质上是一种加载,保存和与#34;物理"之一互动的方式。如上所述的密钥库。如果你只需要为你的应用程序提供API抽象,那么KeyStore也可以纯粹在内存中。

    如何加载和处理这样的KeyStore实例取决于支持它的密钥库文件(或其他存储系统)的格式。 Multiple formats可用。一些最常见的是JKS和PKCS#12(.p12)。

  • "密钥库"也可以用作" truststore"的对应物。这是令人困惑的地方,因为" keystore"和"信任商店"是密钥库,它们只是用于不同的目的。您可以在this answer中找到更多详细信息。密钥库用于初始化密钥管理器,而信任库用于初始化信任管理器。来自JSSE reference guide

      
        
    • A TrustManager确定是否进行远程验证   凭证(以及连接)应该是可信的。

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

    •   

    本质上,用作信任库的密钥库将包含您愿意信任的许多(CA)证书:这些是您将用于验证远程证书的信任锚。已经知道并信任。相反,用作密钥库的密钥库将包含您自己的证书及其私钥:这是您将用于向远程方验证自己的内容(如果需要)。

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

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

通常,当您使用的任何证书无法验证您要连接的服务器的证书时,您所获得的错误(" ValidatorException: PKIX path building failed")就会发生您正在使用的信任库。您通常需要在您的信任库中直接在您的信任库中存储服务器证书(只能在小规模上管理)或用于颁发该服务器证书的CA的CA证书(或链中的一个证书)礼物,当有链时)。

答案 1 :(得分:10)

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

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

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

Certificate Dialog

答案 2 :(得分:0)

我也遇到了这个问题,因为我是在Java程序未使用的JDK中导入证书,因此请检查您程序的当前JDK,然后运行关键工具命令:

keytool -importcert –trustcacerts -alias [certificate name] -keystore "C:\Program Files\Java\jdk1.7.0_71\jre\lib\security\cacerts" -storepass changeit -file [certificate name].cer