【问题标题】:truststore vs keystore in layman terms外行术语中的信任库与密钥库
【发布时间】:2018-06-22 19:55:58
【问题描述】:

我试图以通俗的方式理解信任库和密钥库之间的区别。它们与 java 中的 cacerts 有什么关系?我经历了很多线程,但仍然无法理解何时使用密钥库以及何时使用信任库。

当我尝试通过 https 对 Web 服务进行 API 调用时,我不断收到 SSL 证书问题。 HTTPS 服务使用的是自签名证书,我将证书导入到我的 cacert,但问题仍然存在。我必须在哪里导入此服务器证书?如果导入解决了问题,我在部署应用时是否需要在其他环境中导入证书?

我们的应用程序使用了一个 JKS 文件,它需要什么?当我查看 JKS 文件时,我看到其中有 2 个证书。我们为什么要使用它?

对于信任库,我看到人们说信任我们自己。我们靠什么相信自己?信任库是否使用任何证书?我应该什么时候使用密钥库而不是信任库?

对理解这一点的任何帮助都会对我很有帮助。

【问题讨论】:

  • Truststore 存储您信任的证书(密钥对的公共部分)。这用于客户端证书身份验证 - 如果客户端提交由受信任证书签名的密钥,则他们成功进行身份验证。我们的信任库可选。密钥库存储 key(密钥对的私有部分),服务器用来证明它就是它所说的那个人。 SSL需要一个密钥库
  • 如果我知道在进行 ssl 调用时我需要将证书存储在密钥库中,而不是在 java 中使用 cacerts。在 cacerts 中导入证书并不能解决问题?
  • 这可能有助于理解:*.com/questions/318441/…
  • 从技术上讲,它们是一回事。进行逻辑分离以避免将私钥与公共证书放在同一个文件中。这样的信任库可以安全地重新分配,而共享私钥则完全相反。

标签: java keystore truststore


【解决方案1】:

Truststore - 一个容器,其中包含应该被应用程序接受的证书,也就是受信任的证书。这可以是例如自签名证书或由不在全局列表 CA 中的 CA 机构签名的证书。例如,公司可以拥有自己的 CA 以允许使用自己的证书。将此类 CA 添加到您的信任库(应用程序或将其安装在系统中)将验证 CA 签署的所有其他证书。

Keystore - 存放私钥的容器。这允许应用程序接受使用相应公钥初始化的通信。

在 Java 中,它们都可以是 JKS 格式,并且它们在“技术上”是相同的。出于安全原因,您在逻辑上将它们分成 2 个容器。

您可能不知道的是,PKI 的工作方式是您始终拥有一对唯一的公钥和私钥。公钥用于加密通信,而私钥用于解密。当客户端通过 SSL 通道连接时,它使用公钥来建立密钥交换。如果服务器身份是合法的,它将拥有私钥并且能够进行交换。

现在回答你的问题

我必须在哪里导入此服务器证书?如果进口 解决了问题,我需要在其他地方导入证书吗 部署应用程序时的环境?

服务器必须拥有私钥才能成功进行 SSL 握手。它还使用相应的公钥(即在证书中)介绍自己。如果该证书由全球受信任的 CA 签名 - 无需执行任何操作 - 证书将被信任。如果不是(自签名、私有 CA),则必须将其添加到客户端信任库中,以告知应用程序应该信任此特定证书,尽管没有公共权威保证。

如果导入解决了问题,是否需要导入证书 在其他环境中部署应用程序时?

必须告知每个系统它应该信任该特定证书。如果客户端应用程序是您专有的,您可以随其分发信任库。

对于信任库,我看到人们说信任我们自己。我们是什么 相信自己?

通过将给定证书添加到“信任列表” - 信任存储。它的字面意思是,可以连接到使用该特定证书介绍自己的服务器(仍然必须拥有私钥来验证自己)

信任库是否使用任何证书?

信任库只是一个容器。

什么时候应该使用密钥库而不是信任库?

已经回答,但是 - 使用信任库表示使用某些公钥进行连接是安全的,尽管事实上它没有由全局 CA 签名。在服务器端使用密钥库以允许进行正确的握手。

【讨论】:

  • 嗨@Antoniossss 非常感谢您的明确解释。不过,我有一个后续问题。对我来说没有点击的是,尽管这样:对于成功的 SSL 身份验证,服务器是否有:密钥库(意味着私钥和公钥)并且不需要信任库。另一方面,客户端只需要信任库(即服务器的公共证书)而不需要密钥库。如果是这样,为什么客户端不需要密钥库来向服务器验证自己的身份?还有为什么服务器不需要信任库来接受来自客户端的通信?
  • @AhmetEroğlu 这是两种不同的场景——服务器想要验证用户身份,或者用户想要确定服务器的身份。作为端对端通信的一般规则(例如) - 想要验证自己的一方将为此使用私钥,而想要验证另一方的身份是证书所说的应该是什么的一方将使用公共键。
  • 理论上这样就够了。但是,您假设您从某个地方获得了公钥,而实际上服务器会使用您稍后将使用的一些证书(包含公钥)宣布自己。
  • 就像之前的评论一样,在连接建立阶段服务器会用一些证书数据宣布自己——包括公钥。客户可以信任它或拒绝它。这就是存在信任链的原因。默认情况下,您相信如果有人知道证书颁发机构签署了该证书,您可以相信它是有效的并且反映了另一方的真实身份 - 这应该由 CA 物理验证。
  • 实际上这在答案中有所描述:)
最近更新 更多