信任库和密钥库定义
密钥库和信任库之间有什么区别?
密钥库包含私钥,证书及其相应的公钥。
信任库包含您希望与之进行通信的其他方的证书,或来自您信任的证书颁发机构以识别其他方的证书。
-
密钥库包含私钥。 如果您是服务器,或者如果服务器需要客户端身份validation,则只需要这个选项。
-
信任库包含要信任的CA证书。 如果你的服务器的证书是由一个认可的CA签名的,JRE附带的默认信任库已经信任它(因为它已经信任可信的CA),所以你不需要build立自己的或者添加任何东西来自JRE。
资源
在SSL握手中, trustStore的目的是validation凭证 ,而keyStore的目的是提供凭证 。
的keyStore
Java中的keyStore存储与其公钥相对应的私钥和证书,如果您是SSL服务器或SSL,则需要客户端身份validation。
信任库
TrustStore存储来自第三方的证书,Java应用程序通信或由CA(证书颁发机构,如Verisign,Thawte,Geotrust或GoDaddy)签署的可用于识别第三方的证书。
的TrustManager
TrustManager确定是否应该信任远程连接,即远程方是否声明自己的身份,并且KeyManager决定在SSL握手期间应将哪个身份validation凭证发送给远程主机进行身份validation。
如果您是SSL服务器,您将在密钥交换algorithm期间使用私钥,并将与您的公钥对应的证书发送给客户端,此证书是从keyStore获取的。 在SSL客户端,如果使用Java编写,它将使用存储在trustStore中的证书来validation服务器的身份。 SSL证书通常以.cer文件的forms出现,通过使用任何密钥pipe理工具(如keytool )将其添加到keyStore或trustStore中。
来源: http : //javarevisited.blogspot.ch
作为标准JSSE文档的一部分,您也可能对Sun撰写的文章感兴趣:
http://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#Stores
通常情况下,信任存储仅用于存储公钥,用于validation目的,例如使用X.509身份validation。 出于可pipe理性目的,pipe理员或开发人员将两者简单地混合到一个商店中是相当普遍的。
在Java中,密钥库和信任库之间有什么区别?
以下是Java Secure Socket Extension(JSSE)参考指南中有关Java文档的描述。 我不认为它告诉你任何与别人所说的不同的东西。 但它确实提供了官方的参考。
密钥库/信任
密钥库是密钥材料的数据库。 主要材料用于多种用途,包括authentication和数据完整性。 有各种types的密钥库可用,包括PKCS12和Oracle的JKS。
一般来说,密钥库信息可以分为两类:密钥条目和可信的证书条目。 密钥条目由实体的身份和私钥组成,可用于各种encryption目的。 相比之下,除了实体的身份之外,受信任的证书条目仅包含公钥。 因此,如果需要私钥,则不能使用受信任的证书条目,例如在javax.net.ssl.KeyManager中。 在JKS的JDK实现中,密钥库可能包含密钥条目和可信证书条目。
信任库是在决定要信任什么时使用的密钥库。 如果您从您已经信任的实体接收数据,并且如果您可以validation该实体是它声称的实体的数据,那么您可以假设数据确实来自该实体。
如果用户信任该实体,则只应将条目添加到信任库。 通过生成密钥对或通过导入证书,用户对该条目给予信任。 信任库中的任何条目均被视为可信条目。
有两个不同的密钥库文件是有用的:一个仅包含您的密钥条目,另一个包含您的可信证书条目(包括CA证书)。 前者包含私人信息,而后者则不包含私人信息。 使用两个文件而不是单个密钥库文件提供了您自己的证书(和相应的私钥)与其他证书之间的逻辑区分的更清晰的分离。 要为您的私钥提供更多保护,请将其存储在具有受限访问权限的密钥库中,并在需要时提供可公开访问的密钥库中的可信证书。
-
TrustStore和keyStore之间的主要区别在于TrustManager使用trustStore来确定是否应该信任远程连接,KeyManager使用KeyManager决定在SSL握手期间应将哪些authentication凭证发送到远程主机进行authentication。
-
另一个区别是,keyStore在理论上只包含在SSL连接中运行服务器时所需的私钥,或者在服务器端启用了客户机authentication,另一方面,trustStore存储来自CA(证书颁发机构)的公钥或证书信任远程方或SSL连接。
事实上,你可以在同一个文件中存储私钥和公钥,因为pipe理这些文件的工具是相同的(keytool),所以你可以使用一个文件来达到这个目的,但是你可能不应该这么做 。
-
至less在我的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
可能还需要设置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