我了解 keystore 通常会保存私钥/公钥,而信任库仅保存公钥(并代表您打算与之通信的受信任方的列表)。嗯,这是我的第一个假设,所以如果这不正确,我可能还没有很好地开始......
我有兴趣了解使用 keytool 时如何/何时区分商店。
到目前为止,我已经使用
创建了一个 keystore
keytool -import -alias bob -file bob.crt -keystore keystore.ks
创建我的 keystore.ks 文件。我对我是否信任 bob 的问题回答 yes
,但我不清楚这是否创建了 keystore 文件或信任库文件?我可以将我的应用程序设置为使用该文件。
-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")
,我可以在受信任的证书下看到证书(但不在 keystore 部分下)。我要导入的特定证书只有一个公钥,我打算用它通过 SSL 连接向 Bob 发送内容(但也许最好留给另一个问题!)。
任何指示或澄清将不胜感激。无论您导入什么,keytool 的输出是否都相同,并且只是约定一个是 keystore ,另一个是信任库?使用SSL等有什么关系?
术语确实有点困惑,但是 javax.net.ssl.keyStore
和 javax.net.ssl.trustStore
都用于指定要使用的 keystore , 用于两个不同的目的。 keystore 有多种格式,甚至不一定是文件(参见 this question),keytool
只是对它们执行各种操作的工具(导入/导出/列表/...)。
javax.net.ssl.keyStore
和 javax.net.ssl.trustStore
参数是用于构建 KeyManager
的默认参数和 TrustManager
s(分别),然后用于构建一个 SSLContext
,它本质上包含通过 SSLSocketFactory 建立 SSL/TLS 连接时要使用的 SSL/TLS 设置
或 SSLEngine
。这些系统属性只是默认值的来源,然后由 SSLContext.getDefault()
使用,例如 SSLSocketFactory.getDefault()
本身使用。 (如果您不想将默认值和特定的 SSLContext
s 用于给定目的,所有这些都可以通过 API 在许多地方进行自定义。)
KeyManager
和 TrustManager
之间的区别(以及 javax.net.ssl.keyStore
和 javax.net 之间的区别。 ssl.trustStore
)如下(引自JSSE ref guide):
TrustManager: Determines whether the remote authentication credentials (and thus the connection) should be trusted.
KeyManager: Determines which authentication credentials to send to the remote host.
(其他参数可用,它们的默认值在 JSSE ref guide 中描述。请注意,虽然信任库有默认值,但 keystore 没有默认值。)
本质上,javax.net.ssl.keyStore
中的 keystore 旨在包含您的私钥和证书,而 javax.net.ssl.trustStore
意味着包含您愿意在远程方出示其证书时信任的 CA 证书。在某些情况下,它们可以是同一个存储,但使用不同的存储通常是更好的做法(尤其是当它们基于文件时)。
我是一名优秀的程序员,十分优秀!