【问题标题】:android: Why Client not sending ssl certificate when its not signed by the same CA as of Serverandroid:为什么客户端不发送 ssl 证书,而不是由与服务器相同的 CA 签名
【发布时间】:2012-08-22 19:01:08
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android ssl


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-04-15
      • 2010-11-13
      • 2011-06-11
      • 2014-06-07
      • 2018-11-29
      • 2015-08-17
      • 2013-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多