信任库与密钥库的区别(通俗易懂版)

6
我想要理解信任商店(truststore)和密钥库(keystore)的区别。它们与Java中的cacerts有什么关系?我查阅了很多线程,但仍无法理解何时使用keystore和truststore。
当我尝试通过https调用Web服务时,我一直遇到SSL证书问题。HTTPS服务使用自签名证书,我将证书导入了我的cacert,但问题仍然存在。我需要在哪里导入这个服务器证书?如果导入可以解决问题,那么在部署应用程序时,我是否需要在其他环境中导入证书?
我们的应用程序使用JKS文件,需要什么?当我查看JKS文件时,发现其中有2个证书,我们为什么要使用它?
对于truststore,我看到人们说要自己信任自己。我们自己信任什么?truststore使用任何证书吗?何时应该使用keystore而不是truststore?
希望能够帮助我更好地理解这些内容。

2
Truststore 存储您信任的证书(密钥对的公共部分)。这用于客户端证书身份验证 - 如果客户端提交的密钥由受信任的证书签名,则它们将成功进行身份验证。Truststore 是可选的。Keystore 存储服务器用于证明其身份的密钥(密钥对的私有部分)。SSL 需要 Keystore。 - Boris the Spider
如果我理解正确,当进行SSL调用时需要将证书存储在密钥库中,那么cacerts在Java中的作用是什么?将证书导入到cacerts中不能解决问题吗? 把证书导入cacerts不足以解决问题吗? - Praveen
这可能有助于理解:https://dev59.com/iHRC5IYBdhLWcg3wXP0C?answertab=votes#tab-top - user152468
从技术上讲,它们是相同的东西。逻辑分离是为了避免将私钥与公共证书放在同一个文件中。这样的信任存储可以安全地重新分发,而共享私钥则完全相反。 - Antoniossss
1个回答

5
信任存储(Truststore)- 一个包含应用程序应该接受,即可信的证书的容器。例如,自签名证书或由未列在全局CA列表中的CA授权签名的证书。例如,公司可以拥有自己的CA以允许使用其自己的证书。将这样的CA添加到您的信任存储(应用程序或在系统上安装)将验证由CA签名的所有其他证书。
密钥库(Keystore)- 包含私钥的容器。这使应用程序能够接受使用相应公钥初始化的通信。
在Java中,它们可以都采用JKS格式,并且它们在“技术上”是相同的东西。由于安全原因,您将其逻辑分为两个容器。
您可能不知道的是,PKI的工作方式总是具有唯一的公钥和私钥对。公钥用于加密通信,而私钥用于解密。当客户端通过SSL通道连接时,它使用公钥建立密钥交换。如果服务器身份是合法的,则它将具有私钥并将能够继续进行交换。
现在回答您的问题:
在哪里导入此服务器证书?如果导入解决了问题,部署应用程序时是否需要在其他环境中导入证书?
服务器必须具有私钥才能进行成功的SSL握手。此外,它使用相应公钥(在证书中)介绍自己。如果该证书由全球受信任的CA签名-无需执行任何操作-该证书将得到信任。如果没有(自签名,私有CA),则必须将其添加到客户端的信任存储库中,以告诉应用程序尽管没有公共机构保证,但应信任该特定证书。
如果导入解决了问题,部署应用程序时是否需要在其他环境中导入证书?
每个系统都必须被告知它应该信任那个特定证书。如果客户端应用程序是专有的,则可以随其一起分发信任存储。
对于信任存储,我看到人们说要信任自己。我们信任自己什么?
通过将给定证书添加到“信任列表”即信任存储中,它实际上表示,连接到介绍自己具有特定证书的服务器是安全的(仍然必须具有私钥进行身份验证)。
信任存储是否使用任何证书?
信任存储只是一个容器。
何时应该使用密钥库而不是信任存储?
已经回答过了,但是-使用信任存储来表示使用某些公钥进行连接是安全的,尽管它未经全局CA签名。在服务器端使用密钥库,以允许进行适当的握手。

嗨@Antoniossss,非常感谢您清晰的解释。我有一个后续问题。我不明白的是:虽然这样做可以成功进行SSL身份验证,但服务器只需要密钥库(即私钥和公钥),而不需要信任库。另一方面,客户端只需要信任库(即服务器的公共证书),而不需要密钥库。如果是这样,为什么客户端不需要密钥库来向服务器进行身份验证?还有,为什么服务器不需要信任库来接受来自客户端的通信呢? - Ahmet Eroğlu
1
@AhmetEroğlu 这是两种不同的情况 - 服务器要么想要验证用户身份,要么用户想要确保服务器的身份。作为一般规则,在点对点通信中(例如),想要进行身份验证的一方将使用私钥,而想要验证另一方身份是否符合证书所说的身份的一方将使用公钥。 - Antoniossss
1
理论上来说,这就足够了。然而,在实践中,服务器会使用某些包含公钥的证书(certificate)来宣告自己,你稍后将使用该证书。 - Antoniossss
1
就像之前的评论中所提到的,在连接建立阶段,服务器会使用一些证书数据(包括公钥)来宣布自己。客户端可以选择信任或拒绝。这就是为什么信任链存在的原因。默认情况下,您信任某个已知的证书颁发机构签署了该证书,您可以相信它是有效的,并反映了另一方的真实身份 - 这应该由 CA 在物理上进行验证。 - Antoniossss
1
实际上,这在答案中已经描述了 :) - Antoniossss
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接