311

密钥库和信任库有什么区别?

4

7 回答 7

295

密钥库包含私钥,以及带有相应公钥的证书。

信任库包含来自您希望与之通信的其他方的证书,或者来自您信任以识别其他方的证书颁发机构的证书。

于 2008-11-25T18:42:07.543 回答
90
  1. 密钥库包含私钥。仅当您是服务器或服务器需要客户端身份验证时才需要此功能。

  2. 信任库包含要信任的 CA 证书。如果您的服务器证书由公认的 CA 签名,则 JRE 附带的默认信任库将已经信任它(因为它已经信任可信赖的 CA),因此您无需构建自己的证书,或向其中添加任何内容来自 JRE。

来源

于 2009-09-18T16:35:57.040 回答
80

在 SSL 握手中trustStore 的目的是验证凭据,而 keyStore的目的是提供凭据

密钥库

Java 中的 keyStore 存储与其公钥对应的私钥和证书,如果您是 SSL 服务器或 SSL 需要客户端身份验证,则需要。

信任库

TrustStore 存储来自第三方的证书、您的 Java 应用程序通信或由 CA(Verisign、Thawte、Geotrust 或 GoDaddy 等证书颁发机构)签署的证书,可用于识别第三方。

信任管理器

TrustManager 确定远程连接是否应该被信任,即远程方是否是它声称的对象,而 KeyManager 决定在 SSL 握手期间应该将哪些身份验证凭据发送到远程主机进行身份验证。

如果您是 SSL 服务器,您将在密钥交换算法期间使用私钥并将与您的公钥对应的证书发送给客户端,该证书是从 keyStore 获取的。在 SSL 客户端,如果它是用 Java 编写的,它将使用存储在 trustStore 中的证书来验证服务器的身份。SSL 证书通常以.cer文件的形式出现,该文件通过使用任何密钥管理实用程序(例如keytool)添加到 keyStore 或 trustStore 中。

来源:http: //javarevisited.blogspot.ch

于 2013-09-20T08:44:48.910 回答
31

作为标准 JSSE 文档的一部分,您可能还对 Sun 的文章感兴趣:

http://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#Stores

通常,信任库仅用于存储公钥,用于验证目的,例如 X.509 身份验证。出于可管理性的目的,管理员或开发人员将两者简单地合并到一个商店中是很常见的。

于 2010-01-03T00:01:21.130 回答
12

在 Java 中,密钥库和信任库有什么区别?

这是Java Secure Socket Extension (JSSE) Reference Guide中 Java 文档的描述。我不认为它告诉你任何与其他人所说的不同的东西。但它确实提供了官方参考。

密钥库/信任库

密钥库是密钥材料的数据库。密钥材料用于多种目的,包括身份验证和数据完整性。有多种类型的密钥库可用,包括 PKCS12 和 Oracle 的 JKS。

一般来说,密钥库信息可以分为两类:密钥条目和可信证书条目。密钥条目由实体的身份及其私钥组成,可用于各种加密目的。相反,受信任的证书条目除了实体的身份之外仅包含一个公钥。因此,不能在需要私钥的地方使用受信任的证书条目,例如在 javax.net.ssl.KeyManager 中。在 JKS 的 JDK 实现中,密钥库可能同时包含密钥条目和可信证书条目。

信任库是在决定信任什么时使用的密钥库。如果您从您已经信任的实体接收数据,并且如果您可以验证该实体是它声称的实体,那么您可以假设数据确实来自该实体。

仅当用户信任该实体时,才应将条目添加到信任库。通过生成密钥对或导入证书,用户信任该条目。信任库中的任何条目都被视为可信条目。

拥有两个不同的密钥库文件可能很有用:一个仅包含您的密钥条目,另一个包含您的受信任证书条目,包括 CA 证书。前者包含私人信息,而后者不包含。使用两个文件而不是单个密钥库文件可以更清晰地区分您自己的证书(和相应的私钥)与其他人的证书之间的逻辑区别。要为您的私钥提供更多保护,请将它们存储在访问受限的密钥库中,并在需要时在更公开访问的密钥库中提供受信任的证书。

于 2014-03-24T21:23:22.167 回答
4
  1. trustStore 和 keyStore 之间的第一个也是主要的区别是 TrustManager 使用 trustStore 来确定是否应该信任远程连接,而 KeyManager 使用 keyStore 来决定在 SSL 握手期间应该将哪些身份验证凭据发送到远程主机进行身份验证。

  2. 另一个区别是,keyStore 理论上包含仅当您在 SSL 连接中运行服务器或在服务器端启用客户端身份验证时才需要的私钥,另一方面,trustStore 存储来自 CA(证书颁发机构)的公钥或证书,用于信任远程方或 SSL 连接。

    实际上,您可以将私钥和公钥存储在同一个文件中,因为管理这些文件的工具是相同的(keytool),因此您可以将单个文件用于这两个目的,但您可能不应该使用.

  3. 至少在我的 Mac OSX 上,默认 keyStore 是${user.home}/.keystore,默认 trustStore 是/System/Library/Java/Support/CoreDeploy.bundle/Contents/Home/lib/security/cacerts.

    如果要覆盖它们,则应添加 JVM 参数 -Djavax.net.ssl.keyStore /path/to/keyStore-Djavax.net.ssl.trustStore /path/to/trustStore. 在 的情况下,您可能还需要设置 keyStore 密码 java.security.UnrecoverableKeyException: Password must not be null,使用参数 -Djavax.net.ssl.trustStorePassword=password-Djavax.net.ssl.trustStorePassword=password

主要来源:

http://javarevisited.blogspot.co.uk/2012/09/difference-between-truststore-vs-keyStore-Java-SSL.html

于 2016-01-13T15:27:31.710 回答
0

Keystore 用于存储特定程序应提供给双方(服务器或客户端)以进行验证的私钥和身份证书。

Truststore 用于存储来自认证机构 (CA) 的证书,这些证书验证服务器在 SSL 连接中提供的证书。

本文供参考https://www.education.io/edpresso/keystore-vs-truststore

于 2020-10-05T14:52:41.403 回答