信任库和密钥库定义


Answers:


268

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

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


12
尽管这在实践中应该是正确的,但它们可以(并且经常)是同一个人。实际上,您可以将私钥和公共证书导入[java home] / jre / lib / security / cacerts的默认“ truststore”中。keytool实用程序在这两个术语中没有区别,仅在商店类型方面(即-JKS与PKCS12)没有区别。因此,Java在源代码中执行相同的操作。您创建一个java.security.KeyStore,并使用信任管理器来管理其中的证书,但是没有TrustStore类。

4
Java没有一个TrustStore 本身。或者我在Java文档中找不到它(例如,java.security.TrustStore)。当我们想信任证书颁发机构时,可以通过信任证书颁发机构KeyStore(并将KeyStore传递给TrustManagerFactory)。
jww

5
值得一提的是KeyStore.load(InputStream is, char[] password)docs)可以输入一个空密码,然后它将访问公共证书。也就是说,想要浏览信任库的代码不需要知道它的密码(出于很好的理由!)
xverges 2015年

83
  1. 密钥库包含私钥。仅当您是服务器或服务器需要客户端身份验证时才需要此功能。

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

资源


73

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

密钥库

Java中的keyStore存储私钥和与它们的公钥相对应的证书,并且如果您是SSL Server或SSL需要客户端身份验证,则要求。

信任库

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

信托经理

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

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

来源:http//javarevisited.blogspot.ch


31

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

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

通常,信任存储区仅用于存储公用密钥,以进行验证(例如使用X.509身份验证)。出于可管理性目的,对于管理员或开发人员而言,将二者简单地合并到一个存储中是很普遍的。


1
不幸的是给出了404-
克里斯·比奇

@ChrisBeach-已将链接更新为Oracle站点上正确的链接。
Peter Mularien 2014年

1
信任库用于存储信任的签署者证书。
罗恩侯爵

9

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

这是Java安全套接字扩展(JSSE)参考指南中 Java文档中的描述。我认为这不会告诉您与别人所说的任何不同之处。但这确实提供了官方参考。

密钥库/信任库

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

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

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

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

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


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。如果是,您可能还需要java.security.UnrecoverableKeyException: Password must not be null使用参数 -Djavax.net.ssl.trustStorePassword=password或来设置keyStore密码 -Djavax.net.ssl.trustStorePassword=password

主要来源:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.