【发布时间】:2019-11-04 13:58:54
【问题描述】:
我对 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 验证的证书)。
【问题讨论】:
-
这取决于你想做什么。您想只信任特定的服务器证书还是信任特定 CA 颁发的所有证书?
-
如果它们都有效,则它不是自签名证书。您应该使用 CA 证书。您不能“重建”证书。
-
@SteffenUllrich 感谢您的回复。实际上,我想信任由特定 CA 颁发的所有证书。您能告诉我如何信任特定证书以及如何信任 Android 中特定 CA 颁发的所有证书吗?我很困惑为什么上面显示的代码可以同时使用 server.crt 和 ca.crt。
-
@user207421 感谢您的回复。上面显示的代码实际上适用于两个证书。我知道我应该使用 CA 证书来信任该 CA 颁发的所有证书。我很困惑为什么我在客户端使用 server.crt 可以工作(服务器端在握手中返回自签名的 server.crt)。顺便说一句,我在服务器端“重新构建”证书意味着我使用 server.key 和 ca.key 生成新证书。
-
它可以工作因为它不是自签名证书。我已经说过了。