信任库和密钥库定义

Posted

技术标签:

【中文标题】信任库和密钥库定义【英文标题】:Truststore and Keystore Definitions 【发布时间】:2010-09-24 00:34:17 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

虽然这在实践中应该是正确的,但它们可以(并且经常是)一脉相承。您实际上可以将私钥和公共证书导入 [java home]/jre/lib/security/cacerts 默认“信任库”。 keytool 实用程序不区分这两个术语,仅区分存储类型(即 - JKS 与 PKCS12)。就此而言,Java 在源代码中做同样的事情。您创建了一个 java.security.KeyStore,并使用信任管理器来管理其中的证书,但没有 TrustStore 类。 Java 没有TrustStore 本身。或者我在 java 文档中找不到它(例如,java.security.TrustStore)。当我们想要信任一个证书颁发机构时,它通过KeyStore 被信任(并且KeyStore 被传递到TrustManagerFactory)。 值得一提的是,KeyStore.load(InputStream is, char[] password) (docs) 可以输入一个空密码,然后它就可以访问公共证书。也就是说,想要浏览信任库的代码不需要知道密码(有很好的理由!)【参考方案2】:

    密钥库包含私钥。如果你是,你只需要这个 服务器,或者如果服务器需要客户端身份验证。

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

Source

【讨论】:

【参考方案3】:

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

keyStore

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

信任库

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

信任管理器

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

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

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

不幸的是给出了 404 @ChrisBeach - 已将链接更新到 Oracle 网站上的正确链接。 信任库用于存储受信任的签名者证书。【参考方案5】:

在 Java 中,keystore 和 truststore 有什么区别?

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

密钥库/信任库

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

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

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

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

拥有两个不同的密钥库文件可能很有用:一个只包含您的密钥条目,另一个包含您的 受信任的证书条目,包括 CA 证书。前者 包含私人信息,而后者不包含。使用两个 文件而不是单个密钥库文件提供了更清晰的分离 您自己的证书(和 对应的私钥)和其他人的证书。提供更多 保护您的私钥,将它们存储在密钥库中 限制访问,并以更多的方式提供受信任的证书 如果需要,可公开访问的密钥库。

【讨论】:

【参考方案6】:

    trustStore 和 keyStore 之间的第一个和主要区别是 TrustManager 使用 trustStore 来确定远程连接是否应该被信任,keyStore 用于 KeyManager 决定在 SSL 期间应该将哪些身份验证凭据发送到远程主机进行身份验证握手。

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

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

    至少在我的 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

【讨论】:

【参考方案7】:

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

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

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

【讨论】:

以上是关于信任库和密钥库定义的主要内容,如果未能解决你的问题,请参考以下文章

jetty SSL如何与java密钥库和多个别名一起使用

WebLogic配置自己定义密钥库和SSL的操作手冊

在 JVM 中注册多个密钥库

在 spring boot application.properties 中指定信任存储信息

Tomcat 服务器和 HTTP 客户端接受过期的自签名证书

信任库中信任哪些证书?