Trust Store 与 Key Store - 使用 keytool 创建

新手上路,请多包涵

我知道密钥库通常会保存私钥/公钥,而信任库只保存公钥(并代表您打算与之通信的可信方列表)。好吧,这是我的第一个假设,所以如果这不正确,我可能还没有开始很好……

不过,我有兴趣了解在使用 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 许可协议

阅读 1.1k
2 个回答

术语确实有点混乱,但是 javax.net.ssl.keyStorejavax.net.ssl.trustStore 都用于指定要使用的密钥库,用于两个不同的目的。密钥库有多种格式,甚至不一定是文件(请参阅 此问题), keytool 只是对它们执行各种操作(导入/导出/列表/…)的工具。

The javax.net.ssl.keyStore and javax.net.ssl.trustStore parameters are the default parameters used to build KeyManager s and TrustManager s (respectively), then used to build an SSLContext 本质上包含通过 SSLSocketFactorySSLEngine -55792 建立 SSL/TLS 连接时使用的 SSL/TLS 设置这些系统属性正是默认值的来源,然后由 SSLContext.getDefault() 使用,例如 SSLSocketFactory.getDefault() 使用。 (如果您不想使用默认值和特定的 SSLContext 用于给定目的,则可以在许多地方通过 API 自定义所有这些。)

The difference between the KeyManager and TrustManager (and thus between javax.net.ssl.keyStore and javax.net.ssl.trustStore ) is as follows (quoted from the JSSE ref guide ) :

TrustManager:确定是否应信任远程身份验证凭据(以及连接)。

KeyManager:确定将哪些身份验证凭据发送到远程主机。

(其他参数可用,它们的默认值在 JSSE 参考指南 中进行了描述。请注意,虽然信任存储有默认值,但密钥存储没有默认值。)

本质上, javax.net.ssl.keyStore 中的密钥库意味着包含您的私钥和证书,而 javax.net.ssl.trustStore 意味着包含您愿意在远程方出示其证书时信任的 CA 证书证书。在某些情况下,它们可以是同一个商店,尽管通常更好的做法是使用不同的商店(尤其是当它们基于文件时)。

原文由 Bruno 发布,翻译遵循 CC BY-SA 3.0 许可协议

以常见的用例/目的或外行方式解释:

TrustStore :用于存储可信实体的 _证书_。进程可以维护它信任的所有受信方的证书存储。

keyStore :用于存储服务器 _密钥_(公钥和私钥)以及签名证书。

在 SSL 握手期间,

  1. 客户端尝试访问 https://

  2. 因此,服务器通过提供 SSL 证书(存储在其密钥库中)进行响应

  3. 现在,客户端收到 SSL 证书并通过 trustStore 对其进行验证(即客户端的 trustStore 已经具有它信任的预定义证书集。)。就像:我可以信任这个服务器吗?这是我要与之交谈的同一台服务器吗?没有中间人攻击?

  4. 一次,客户端验证它正在与它信任的服务器对话,然后 SSL 通信可以通过共享密钥进行。

注意:我在这里不是在谈论服务器端的客户端身份验证。如果服务器也想进行客户端身份验证,那么服务器也会维护一个 trustStore 来验证客户端。然后它变成了双向 TLS。

原文由 Balaji Boggaram Ramanarayan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题