密钥库(keystore)和信任库(truststore)有什么区别?
密钥库包含私钥。只有当您是服务器或服务器需要客户端身份验证时才需要使用它。
信任库包含要信任的CA证书。如果您的服务器证书由公认的CA签名,那么随JRE一起提供的默认信任库将已经信任它(因为它已经信任可信的CA),因此您不需要构建自己的信任库,也不需要向JRE中的信任库添加任何内容。
在Java中,密钥库和信任库有什么区别?
根据Java Secure Socket Extension (JSSE) 参考指南的描述(摘自Java文档),密钥库是存储密钥材料的数据库。密钥材料用于各种目的,包括身份验证和数据完整性。有多种类型的密钥库可供选择,包括PKCS12和Oracle的JKS。
一般来说,密钥库信息可以分为两类:密钥条目和受信任的证书条目。密钥条目包含实体的标识和其私钥,并可用于各种加密目的。相比之下,受信任的证书条目只包含公钥和实体的标识。因此,在需要私钥的情况下,如javax.net.ssl.KeyManager中,无法使用受信任的证书条目。在JDK实现的JKS中,一个密钥库可以包含密钥条目和受信任的证书条目。
信任库是用于决定是否信任的密钥库。如果您从已经信任的实体接收数据,并且您可以验证该实体确实是它所声称的实体,则可以假定该数据确实来自于该实体。
只有当用户信任某个实体时,才应将条目添加到信任库中。通过生成密钥对或导入证书,用户向该条目提供了信任。信任库中的任何条目都被视为可信条目。
可能有两个不同的密钥库文件:一个仅包含您的密钥条目,另一个包含您的受信任证书条目,包括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
。您还可能需要设置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
Keystore 用于存储私钥和身份证书,特定程序需要向双方(服务器或客户端)展示进行验证。
Truststore 用于存储认证机构(CA)的证书,以验证 SSL 连接中服务器呈现的证书。
本文章参考链接 https://www.educative.io/edpresso/keystore-vs-truststore
TrustStore
的东西。或者说我在Java文档中找不到它(例如java.security.TrustStore
)。当我们想要信任一个证书颁发机构时,是通过KeyStore
来实现的(并且KeyStore
会被传递给TrustManagerFactory
)。 - jwwKeyStore.load(InputStream is, char[] password)
方法(文档)可以接受空密码,这将允许访问公共证书。也就是说,想要浏览密钥库的代码不需要知道其密码(有很好的理由!)。 - xverges