什么是Keystore?

sap*_*Pro 57 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
Run Code Online (Sandbox Code Playgroud)

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

Bru*_*uno 132

Java中的密钥库可以引用三种内容,具体取决于上下文.(它们都是密切相关的,但却略有不同.)

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

  • KeyStore也是一个类,它是标准API的一部分.它本质上是一种加载,保存并通常与如上所述的"物理"密钥库之一交互的方式.KeyStore如果您只需要应用程序的API抽象,那么A 也可以纯粹在内存中.

    如何加载和处理此类KeyStore实例取决于支持它的密钥库文件(或其他存储系统)的格式.有多种格式可供选择.一些最常见的是JKS和PKCS#12(.p12).

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

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

    • A KeyManager确定要将哪些身份验证凭据发送到远程主机.

    实质上,用作信任库的密钥库将包含您愿意信任的许多(CA)证书:这些证书是您将用于验证您尚不了解和信任的远程证书的信任锚.相反,用作密钥库的密钥库将包含您自己的证书及其私钥:这是您将用于向远程方验证自己的时间(如果需要).

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

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

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

  • @Jayesh正如我所说,有一个默认的信任库.它包含JRE已经信任的许多CA证书,包括验证google.com的证书.你的第二个问题(关于被拒绝的连接)与密钥库无关:如果服务器拒绝连接,就是它,连接被拒绝......没有任何反应. (3认同)
  • @Jayesh不太好.服务器证书不一定需要位于信任库中,但至少需要一个可以验证服务器证书的CA证书.说"*通信开始使用[证书的密钥*加密]"当然不正确:这不是SSL/TLS的工作原理,但这是一个完全不同的事情.通常,是的,如果您的信任库不包含可用于验证服务器证书(或CA证书本身)的CA证书,则您将无法连接,除非您还禁用了证书验证你的代码(你不应该). (3认同)

Zee*_*mee 10

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

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

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

证书对话框

  • 您正在使用密钥库概念的一个非常特定的子集.特别是,您正在谈论默认的信任库. (4认同)