1

我有两种情况用于创建带有客户端验证的 ssl 连接。

1- 我的 android 客户端和服务器具有由同一 CA 签名的证书,启用了服务器上的客户端验证。我在 trustmanager keystore 中加载 CA 证书,在 keymanager keystore 中加载客户端 key+cert+ca 并将其传递给 ssl.init(keymanager, trustmanager)。它工作正常,双方交换并相互验证证书。

2- 现在我有由不同 CA 签署的客户端和服务器证书,例如由 ServerCA 签署的服务器证书和由 ClientCA 签署的客户端证书。我重复上面的过程,但是当服务器要求时,客户端从不发送任何证书,为什么?

  • ssl.init 中的 keymanager 和 trustmanager 之间有什么联系?
4

1 回答 1

3

服务器在证书请求消息中的 TLS 握手期间请求客户端证书,其中包含服务器愿意接受的证书颁发机构(它们的主题 DN)列表。

客户端通常使用它来选择要发送哪个证书(并选择是否发送一个):如果客户端有一个证书链可以通向列表中的一个 CA,它将使用该链。

在带有服务器证书的部分之后,使用openssl s_client -connect the.host.name:443应该向您显示可接受的 CA 列表。

如果您的客户端没有通向其中之一的链,则不太可能使用客户端证书。在这种情况下,类 Java 客户端不使用客户端证书的一个常见原因是在密钥库中导入了客户端证书而没有中间证书(请参阅此问题)。另一个潜在的原因是该服务器根本不知道颁发其他客户端证书的 CA(有或没有中间 CA 证书)。(我在这里假设您的服务器没有发送空列表。)

于 2012-08-28T14:34:13.543 回答