信任库和密钥库定义

319

密钥库(keystore)和信任库(truststore)有什么区别?

7个回答

301
一个keystore包含私钥以及与其相对应的证书和公钥。
一个truststore包含其他您希望通信的方的证书,或者您信任的证书机构用于识别其他方的证书。

20
实际应该是这样的,但它们经常是相同的。您实际上可以将私钥和公共证书导入到[java home]/jre/lib/security/cacerts默认的“truststore”中。keytool实用程序并不区分这两个术语,只区分存储类型(即JKS与PKCS12)。事实上,Java在源代码中也是如此。您创建一个java.security.KeyStore,并使用信任管理器来管理其中的证书,但没有TrustStore类。 - user4903
4
Java本身并没有一个名为TrustStore的东西。或者说我在Java文档中找不到它(例如java.security.TrustStore)。当我们想要信任一个证书颁发机构时,是通过KeyStore来实现的(并且KeyStore会被传递给TrustManagerFactory)。 - jww
6
值得一提的是,KeyStore.load(InputStream is, char[] password)方法(文档)可以接受空密码,这将允许访问公共证书。也就是说,想要浏览密钥库的代码不需要知道其密码(有很好的理由!)。 - xverges

95
  1. 密钥库包含私钥。只有当您是服务器或服务器需要客户端身份验证时才需要使用它。

  2. 信任库包含要信任的CA证书。如果您的服务器证书由公认的CA签名,那么随JRE一起提供的默认信任库将已经信任它(因为它已经信任可信的CA),因此您不需要构建自己的信任库,也不需要向JRE中的信任库添加任何内容。

来源


85
在SSL握手中,trustStore的目的是验证凭据,而keyStore的目的是提供凭证keyStore Java中的keyStore存储私钥和相应公钥的证书,如果你是SSL服务器或SSL需要客户端身份验证,则需要使用它。 TrustStore TrustStore用于存储第三方证书,你的Java应用程序可以与其通信或由CA(例如Verisign、Thawte、Geotrust或GoDaddy)签名的证书,这些证书可用于识别第三方。 TrustManager TrustManager确定是否应该信任远程连接,即远程方是否是其所声称的,并且KeyManager决定在SSL握手期间向远程主机发送哪些身份验证凭据。
如果你是SSL服务器,在密钥交换算法期间将使用私钥并将对应于你的公钥的证书发送给客户端,证书是从keyStore获取的。在SSL客户端端,如果它是用Java编写的,则将使用存储在trustStore中的证书来验证服务器的身份。 SSL证书最常见的形式是.cer文件,可以使用任何密钥管理实用程序(例如keytool)将其添加到keyStore或trustStore中。
来源:http://javarevisited.blogspot.ch

31

1
很遗憾,出现了404错误。 - Chris Beach
@ChrisBeach - 我已经更新了在Oracle网站上的正确链接。 - Peter Mularien
1
信任库用于存储受信任的签名证书 - user207421

15
个文件可以方便地管理和保护这些信息。

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

根据Java Secure Socket Extension (JSSE) 参考指南的描述(摘自Java文档),密钥库是存储密钥材料的数据库。密钥材料用于各种目的,包括身份验证和数据完整性。有多种类型的密钥库可供选择,包括PKCS12和Oracle的JKS。

一般来说,密钥库信息可以分为两类:密钥条目和受信任的证书条目。密钥条目包含实体的标识和其私钥,并可用于各种加密目的。相比之下,受信任的证书条目只包含公钥和实体的标识。因此,在需要私钥的情况下,如javax.net.ssl.KeyManager中,无法使用受信任的证书条目。在JDK实现的JKS中,一个密钥库可以包含密钥条目和受信任的证书条目。

信任库是用于决定是否信任的密钥库。如果您从已经信任的实体接收数据,并且您可以验证该实体确实是它所声称的实体,则可以假定该数据确实来自于该实体。

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

可能有两个不同的密钥库文件:一个仅包含您的密钥条目,另一个包含您的受信任证书条目,包括CA证书。前者包含私人信息,而后者则不包含。使用两个文件可以方便地管理和保护这些信息。

使用多个文件而不是一个单独的密钥库文件可以更清晰地区分您自己的证书(和相应的私钥)与其他人的证书。为了更好地保护您的私密密钥,请将它们存储在具有受限访问权限的密钥库中,并在需要时将信任的证书提供给更公开可访问的密钥库中。

7
  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


0

Keystore 用于存储私钥和身份证书,特定程序需要向双方(服务器或客户端)展示进行验证。

Truststore 用于存储认证机构(CA)的证书,以验证 SSL 连接中服务器呈现的证书。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接