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