Java 什么是密钥库?

Java 什么是密钥库?,java,ssl,keystore,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: s

我得到了:

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
。简单来说,什么是密钥库?它与SSL的关系如何?

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

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

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

根据上下文,Java中的密钥库可以引用三种内容。(它们之间有着密切的联系,但又有细微的区别。)

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

  • 也是一个类,它是标准API的一部分。它本质上是一种加载、保存和通常与上述“物理”密钥库之一交互的方法。如果您只需要应用程序的API抽象,那么
    密钥库也可以完全在内存中

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

  • “密钥库”也可以用作“信任库”的对应项。这就是容易混淆的地方,因为“密钥库”和“信任库”都是密钥库,它们只是用于不同的目的。您可以在中找到更多详细信息。密钥库用于初始化密钥管理器,而信任库用于初始化信任管理器。从:

    • TrustManager
      确定远程身份验证 凭据(以及连接)应该是可信的

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

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

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

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


通常,当您连接到的服务器的证书无法使用您使用的信任库中的任何证书进行验证时,会发生您收到的错误(“
ValidatorException:PKIX路径构建失败
”)。您通常需要在您的信任库中直接拥有服务器证书(仅在小规模上可管理)或用于颁发该服务器证书的CA的CA证书(或当存在链时,它所呈现的链中的一个证书).

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

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

简单的术语:“在Java中,密钥库是安全证书的存储库,可以是授权证书或公钥证书”@BheshGurung我知道这些文档。但我想让外行知道。它是什么及其需要?它与SSL异常有什么关系?@BheshGurung因此,对于我的
localhost
要通过SSL与远程服务器通信,localhost应该拥有某种证书?@BheshGurung您可以在回答中详细说明并解释这一切。那会更有益没有人回答。。奇怪……我今天也遇到了同样的问题……您使用的是密钥库概念的一个非常特定的子集。特别是,您正在谈论默认的信任库。我刚刚尝试连接到“”,它成功地解决了任何密钥库问题,所以我只是想知道它是如何工作的,为什么java在连接到“”时没有给出相同的错误?您能帮我处理流吗,比如。1.用户试图连接到某个“https”站点。2.服务器拒绝从已知主机建立连接或所需连接。你能用那种方式解释我吗?或者把任何链接指向解释它的地方。@Jayesh正如我所说的,这里有一个默认的信任库。它包含许多JRE已经信任的CA证书,包括一个验证google.com的证书。您的第二个问题(关于被拒绝的连接)与密钥库无关:如果服务器拒绝连接,则连接被拒绝。。。什么也没发生,谢谢布鲁诺。所以我可以说,当我们尝试访问https网站时,服务器返回其证书,然后java客户端检查证书是否存在