我有两种情况可以通过客户端验证来创建ssl连接。
1-我的Android客户端和服务器具有由相同CA签名的证书,启用了服务器上的客户端验证。我在trustmanager密钥库中加载CA证书,在keymanager密钥库中加载客户端密钥+ cert + ca,并将其传递给ssl.init(keymanager,trustmanager)。它工作正常,双方交换并相互验证证书。
2-现在我有不同CA签署的客户端和服务器证书,比如ServerCA签署的服务器证书和ClientCA签署的客户端证书。我重复上面的过程,但客户端在服务器要求时从不发送任何证书,为什么?
答案 0 :(得分:2)
服务器在Certificate Request message的TLS握手期间请求客户端证书,其中包含服务器愿意接受的证书颁发机构列表(其主题DN)。
客户端通常使用它来选择要发送的证书(并选择是否发送一个证书):如果客户端有证书链可以导致列表中的一个CA,它将使用该链
在使用服务器证书的部分之后,使用openssl s_client -connect the.host.name:443
应该会显示可接受的CA列表。
如果您的客户没有链接导致其中一个链接,则不太可能使用客户端证书。在这种情况下,类Java客户端不使用客户端证书的一个常见原因是在密钥库中导入了没有中间证书的客户端证书(请参阅this question)。另一个可能的原因是该服务器根本不知道发布该其他客户端证书的CA(有或没有中间CA证书)。 (我假设您的服务器不发送空列表。)