2008-11-25 84 views

回答

233

密钥库包含私钥和证书及其相应的公钥。

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

+10

虽然这应该在实践中是真实的,他们可以(并且经常是)一个人。实际上,您可以将私钥和公共证书导入[java home]/jre/lib/security/cacerts默认的“信任库”。 keytool实用程序在两个术语中没有区别,仅在商店类型中(即 - JKS vs. PKCS12)。对于这个问题,Java在源代码中做了同样的事情。您创建一个java.security.KeyStore,并使用信任管理器来管理其中的证书,但没有TrustStore类。 – 2013-09-05 17:19:05

+4

Java本身没有`TrustStore` *。或者我无法在java文档中找到它(例如`java.security.TrustStore`)。当我们想要信任一个证书颁发机构时,它通过`KeyStore`被信任(并且`KeyStore`被传递给`TrustManagerFactory`)。 – jww 2014-03-24 21:16:46

+5

值得一提的是,`KeyStore.load(InputStream是,char [] password)`([docs](http://docs.oracle.com/javase/7/docs/api/java/security/KeyStore.html #load%28java.io.InputStream,%20char []%29))可以接受一个空密码,然后它将访问公共证书。也就是说,想要浏览信任库的代码不需要知道它的密码(出于很好的理由!) – xverges 2015-01-26 17:42:01

70
  1. 密钥库包含私钥。如果您是服务器的 ,或者服务器需要客户端身份验证,则只需要此设置。

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

Source

60

在SSL握手的目的的trustStore是验证凭证密钥库的目的是提供凭证

的keyStore

的keyStore在Java中存储专用密钥和对应于它们的公钥证书,并要求,如果你是SSL服务器或SSL需要客户端身份验证。

信任库

信任库存储从第三方证书,Java应用程序通信,或者能够用于识别第三方通过CA签名证书(证书颁发机构如Verisign,Thawte安全后,GeoTrust或GoDaddy)。

的TrustManager

的TrustManager确定远程连接是否应该信任与否即对方是否是其宣称和的KeyManager决定哪些认证证书应该被发送到SSL握手期间远程主机进行身份验证谁。

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

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

9

在Java中,什么是一个密钥库和一个信任的区别?

下面是关于Java Secure Socket Extension (JSSE) Reference Guide的Java文档的描述。我认为它不会告诉你与别人所说的不同之处。但它确实提供了官方参考。

密钥库/信任

密钥库是键材料的数据库。密钥材料用于多种用途,包括认证和数据完整性。 各种类型的密钥库都可用,包括PKCS12和 Oracle的JKS。

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

信任库是一个密钥库,用于决定要信任的内容。如果您收到来自您已信任的实体的数据,并且如果您可以验证该实体是其声称的那个实体,那么您可以假设数据确实来自该实体的 。

如果用户信任该实体,则只应将条目添加到信任库。通过生成密钥对或通过导入证书,用户对该条目给予信任。 信任库中的任何条目都被视为可信条目。

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

3
  1. 第一和信任存储用于keyStore之间主要的区别是,的trustStore用于通过的TrustManager确定远程连接是否应被信任,密钥库从的KeyManager决定哪些认证证书应当被发送到远程主机所使用SSL握手期间的身份验证。

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

    事实上,你可以在同一文件中同时存储私钥和公​​钥, 鉴于管理这些文件的工具是一样的(密钥工具), 所以你可以使用一个单独的文件同时为目的,但你 可能不应该

  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。您可能还 需要设置的 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