gpt4 book ai didi

android - 使用自签名证书时应该在 SSLContext 中使用哪个证书?自签名证书或 ca 证书

转载 作者:太空宇宙 更新时间:2023-11-03 15:11:37 25 4
gpt4 key购买 nike

我对android 上ssl 中使用的证书感到很困惑。通常,应该使用 ca.crt(ca certificate) 来验证客户端中的 server.crt(certificate)。但是,在 android 上使用 ssl 时,似乎 ca.crt 和 server.crt 都可以工作。那很奇怪。有人可以解释发生了什么吗?

提前致谢。

如下代码所示,我可以使用 ca.crt 或 server.crt 构建 client.bks。两者都可以成功连接到服务器。顺便说一句,在我用其他信息在服务器端重建 server.crt 后,我​​只能使用 ca.crt 连接服务器。


KeyStore trustKeyStore = KeyStore.getInstance("BKS");
InputStream keyStream = xxxApplication.getInstance().getAssets().open("client.bks");

trustKeyStore.load(keyStream, "".toCharArray());
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(trustKeyStore);
sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(null, trustManagerFactory.getTrustManagers(), null);

换句话说,我想知道 android 中的 SSL 如何使用 TrustManagers 验证服务器证书。我们将用于构建 trustManager 的证书称为“client.crt”。似乎下面的代码允许服务器证书(证书 client.crt 和可以由 client.crt 验证的证书)。

最佳答案

当您进行 TLS 握手时,每一方都可以拥有一个证书(带有关联的私钥),并将其公开给另一方以表明自己的身份。

通常只有服务器证书很重要,例如在 HTTPS 中,但通常情况下,如果服务器请求,客户端也可以提供证书。

从广义上讲,交换是这样的:

  • 客户:你好
  • 服务器:我有证书X
  • (如果服务器希望客户端出示证书)服务器:客户端,请将您的证书发送给我,我认可 CA A、B、C、D
  • (如果服务器要求证书)客户端:这是我的证书 Y

这是什么意思?

当服务器向客户端询问其证书时,它会列出它知道的 CA,即它会引导客户端选择合适的证书(客户端在其信任库中可以有多个证书,因此它需要选择一个 - 它只能发送一个 - 通过某种自动方式或最后让一些人选择一个)

这只是一个指南,客户端可以发送它想要的任何证书,由它喜欢的任何 CA 签名...但是证书可能会被服务器拒绝。

因此,当您配置客户端部分时,要构建“SSL 上下文”,您需要指定您的证书、与证书关联的私钥,以及可选的称为“链”或“中间”的证书列表,作为所有这没有私钥将需要发送到服务器,并单独配置您的一方将某些 CA 识别为完全受信任的,以便您将使用它们来验证服务器证书。

链式/中间证书是因为终端用户/系统证书很少(从不?)直接由 CA 证书签名(当然自签名除外,在这种情况下最终证书也是 CA 证书),所以实际上,客户端需要发送其最终证书和将其最终证书链接到其中一个 CA 证书所需的整个证书链(不需要发送“根”CA 证书)。有了所有这些信息,服务器将能够使用其证书和所有中间证书以及服务器在其自己的本地信任库中拥有的 CA 证书对客户端进行身份验证。

如果您使用“真实”CA(公共(public)或私有(private))配置您的一方,这意味着您将接受任何服务器(对于这部分检查,还有其他检查,例如日期、签名值,当然还有名称包含在证书等中)能够提供此 CA 颁发的证书(再次通过一些中间证书)。相反,如果您直接在那里使用服务器自签名证书,这意味着您实际上只允许使用此证书,而不是其他任何人(因此没有其他服务器,甚至在更改其自签名证书后也不允许该特定服务器)。

请注意,在第一步 (clientHello) 中,客户端还可以列出它知道的 CA(请参阅 RFC8446 的 §4.2.4),但我认为这种情况很少见。

关于android - 使用自签名证书时应该在 SSLContext 中使用哪个证书?自签名证书或 ca 证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58694959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com