我知道密钥库通常会保存私钥/公钥,而信任库只保存公钥(并代表您打算与之通信的可信方列表)。好吧,这是我的第一个假设,所以如果这不正确,我可能还没有开始很好……
不过,我有兴趣了解在使用 keytool 时如何/何时区分商店。
所以,到目前为止,我已经使用创建了一个密钥库
keytool -import -alias bob -file bob.crt -keystore keystore.ks
这会创建我的 keystore.ks 文件。我回答 yes
这个问题我信任 bob 但我不清楚这是否创建了密钥库文件或信任库文件?我可以将我的应用程序设置为使用该文件。
-Djavax.net.ssl.keyStore=keystore.ks -Djavax.net.ssl.keyStorePassword=x
-Djavax.net.ssl.trustStore=keystore.ks -Djavax.net.ssl.trustStorePassword=x
并设置了 System.setProperty( "javax.net.debug", "ssl")
后,我可以在受信任的证书下看到证书(但不在密钥库部分)。我正在导入的特定证书只有一个公钥,我打算用它通过 SSL 连接向 Bob 发送内容(但也许最好留给另一个问题!)。
任何指示或澄清将不胜感激。无论您导入什么,keytool 的输出是否都相同?它的唯一约定是一个是密钥库,另一个是信任库?使用SSL等有什么关系?
原文由 Toby 发布,翻译遵循 CC BY-SA 4.0 许可协议
术语确实有点混乱,但是
javax.net.ssl.keyStore
和javax.net.ssl.trustStore
都用于指定要使用的密钥库,用于两个不同的目的。密钥库有多种格式,甚至不一定是文件(请参阅 此问题),keytool
只是对它们执行各种操作(导入/导出/列表/…)的工具。The
javax.net.ssl.keyStore
andjavax.net.ssl.trustStore
parameters are the default parameters used to buildKeyManager
s andTrustManager
s (respectively), then used to build anSSLContext
本质上包含通过SSLSocketFactory
或SSLEngine
-55792 建立 SSL/TLS 连接时使用的 SSL/TLS 设置这些系统属性正是默认值的来源,然后由SSLContext.getDefault()
使用,例如SSLSocketFactory.getDefault()
使用。 (如果您不想使用默认值和特定的SSLContext
用于给定目的,则可以在许多地方通过 API 自定义所有这些。)The difference between the
KeyManager
andTrustManager
(and thus betweenjavax.net.ssl.keyStore
andjavax.net.ssl.trustStore
) is as follows (quoted from the JSSE ref guide ) :(其他参数可用,它们的默认值在 JSSE 参考指南 中进行了描述。请注意,虽然信任存储有默认值,但密钥存储没有默认值。)
本质上,
javax.net.ssl.keyStore
中的密钥库意味着包含您的私钥和证书,而javax.net.ssl.trustStore
意味着包含您愿意在远程方出示其证书时信任的 CA 证书证书。在某些情况下,它们可以是同一个商店,尽管通常更好的做法是使用不同的商店(尤其是当它们基于文件时)。