Answers:
密钥库包含私钥,以及证书及其相应的公钥。
信任库包含来自您希望与之通信的其他方的证书,或来自您信任以标识其他方的证书颁发机构的证书。
TrustStore
本身。或者我在Java文档中找不到它(例如,java.security.TrustStore
)。当我们想信任证书颁发机构时,可以通过信任证书颁发机构KeyStore
(并将KeyStore
传递给TrustManagerFactory
)。
KeyStore.load(InputStream is, char[] password)
(docs)可以输入一个空密码,然后它将访问公共证书。也就是说,想要浏览信任库的代码不需要知道它的密码(出于很好的理由!)
在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中。
作为标准JSSE文档的一部分,您可能还对Sun撰写的文章感兴趣:
http://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#Stores
通常,信任存储区仅用于存储公用密钥,以进行验证(例如使用X.509身份验证)。出于可管理性目的,对于管理员或开发人员而言,将二者简单地合并到一个存储中是很普遍的。
在Java中,密钥库和信任库之间有什么区别?
这是Java安全套接字扩展(JSSE)参考指南中 Java文档中的描述。我认为这不会告诉您与别人所说的任何不同之处。但这确实提供了官方参考。
密钥库/信任库
密钥库是密钥材料的数据库。密钥材料用于多种目的,包括身份验证和数据完整性。各种类型的密钥库都可用,包括PKCS12和Oracle的JKS。
一般而言,密钥库信息可以分为两类:密钥条目和受信任证书条目。密钥条目包含实体的身份及其私钥,并且可以用于多种加密目的。相反,受信任的证书条目除了实体的身份之外还仅包含公共密钥。因此,在需要私钥的地方(例如在javax.net.ssl.KeyManager中),不能使用受信任的证书条目。在JKS的JDK实现中,密钥库可能同时包含密钥条目和受信任的证书条目。
信任库是在决定信任内容时使用的密钥库。如果您从已经信任的实体接收数据,并且可以验证该实体是它声称的实体,则可以假定数据确实来自该实体。
仅当用户信任该实体时,才应将条目添加到信任库。通过生成密钥对或导入证书,用户可以信任该条目。信任库中的任何条目均被视为可信条目。
拥有两个不同的密钥库文件可能会很有用:一个文件仅包含您的密钥条目,另一个文件包含您的受信任证书条目,包括CA证书。前者包含私人信息,而后者则不包含。使用两个文件而不是单个密钥库文件可以使您自己的证书(和相应的私钥)与其他人的证书之间的逻辑区别更加清晰地分开。要为您的私钥提供更多保护,请将其存储在访问受限的密钥库中,并在需要时将信任的证书提供到更易于访问的密钥库中。
trustStore和keyStore之间的第一个主要区别是TrustManager使用trustStore来确定是否应该信任远程连接,KeyManager使用keyStore来确定应在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
。如果是,您可能还需要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