首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是Keystore?

什么是Keystore?
EN

Stack Overflow用户
提问于 2014-04-22 01:06:44
回答 3查看 83.2K关注 0票数 78

我已经得到了:

代码语言:javascript
复制
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有何关系?

EN

回答 3

Stack Overflow用户

发布于 2014-11-12 21:42:22

Java中的密钥库可以指三件事,这取决于上下文。(它们都是密切相关的,但又有细微的差别。)

  • 密钥库可以是存储私钥、证书和对称密钥的存储库。这通常是一个文件,但也可以以不同的方式处理存储(例如,加密令牌或使用操作系统自己的mechanism.)
  • KeyStore也是标准API的一部分。它本质上是一种加载、保存和通常与上面描述的“物理”密钥库之一交互的方式。如果你只需要你的应用程序的KeyStore抽象,那么它也可以只在内存中。

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

  • "keystore“和PKCS#12 JKS,JKS也可以用作”信任库“的对应物。这就是它容易混淆的地方,因为"keystore“和"truststore”都是密钥库,它们只是用于不同的目的。您可以在this answer中找到更多详细信息。密钥库用于初始化密钥管理器,而信任库用于初始化信任管理器。从JSSE reference guide

代码语言:javascript
复制
- 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)捆绑在一起。没有默认的keystore,因为对于用户来说,这通常是一个更明确的步骤。

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

通常,当您正在连接的服务器的证书无法使用您正在使用的信任库中的任何证书进行验证时,就会出现错误("ValidatorException: PKIX path building failed")。您通常需要在您的信任库中直接拥有服务器证书(仅在小范围内可管理),或者用于颁发该服务器证书的CA的CA证书(或者当存在链时,CA证书是链中的一个证书)。

票数 160
EN

Stack Overflow用户

发布于 2014-11-12 15:32:55

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

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

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

票数 13
EN

Stack Overflow用户

发布于 2019-11-26 23:31:56

我也有这个问题,因为我在JDK中导入了一个不被我的java程序使用的证书,所以检查你的程序的当前JDK,然后运行key tool命令:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23202046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档