使用自签名证书时,应在SSLContext中使用哪个证书?自签名证书或CA证书

我对android的ssl中使用的证书感到非常困惑。通常,应该使用ca.crt(ca证书)来验证客户端中的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验证的证书)。

zwx575207 回答:使用自签名证书时,应在SSLContext中使用哪个证书?自签名证书或CA证书

当您进行TLS握手时,每一方都可以拥有一个证书(带有关联的私钥),该证书会暴露给另一方以进行身份​​识别。

通常像HTTPS一样,仅服务器证书很重要,但是通常,如果服务器请求,客户端也可以出示证书。

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

  • 客户端:您好
  • 服务器:我有证书X
  • (如果服务器希望客户端提供证书)服务器:客户端,请将我的证书发送给我,我可以识别CA A,B,C,D
  • (如果服务器要求提供证书)客户端:这是我的证书Y

那是什么意思?

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

这只是一个指导,客户端可以发送所需的任何证书,并由其喜欢的任何CA签名...但是冒着证书被服务器拒绝的风险。

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

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

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

请注意,在第一步(clientHello)中,客户端还可以列出其了解的CA(请参阅RFC8446的§4.2.4),但我相信这种情况很少见。

,

作为我观察到的结果,我相信android中的默认trustManagerFactory将接受两种类型的证书。其中一个包含我们在trustManagerFactory中加载的证书。另一个包含可以由我们加载的证书正确验证的证书。

因此,一个人可以加载服​​务器证书以信任特定的证书,也可以加载ca证书以信任可以由该ca证书验证的一组证书。

本文链接:https://www.f2er.com/3166195.html

大家都在问