android:为什么客户端没有发送ssl证书,当它没有通过相同的CA签名服务器时

问题描述:

我有两种方案创建SSL客户端验证的SSL连接。android:为什么客户端没有发送ssl证书,当它没有通过相同的CA签名服务器时

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

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

  • ssl.init中keymanager和trustmanager之间的链接是什么?

客户端证书由服务器的TLS握手的Certificate Request message,其中包含证书颁发机构(它们的主题DNS)服务器愿意接受的列表中请求。

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

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

如果您的客户没有导致其中一个链的链,那么客户端证书不太可能被使用。在这种情况下,类似Java的客户端不使用客户端证书的常见原因是在密钥存储区中导入了客户端证书,而没有其中间证书(请参阅this question)。另一个可能的原因是,此服务器对发布其他客户端证书的CA(有或没有中间CA证书)根本不了解。 (我假设您的服务器不会发送空列表。)