android:为什么客户端在未由与服务器相同的 CA 签名时不发送 ssl 证书

标签 android ssl

我有两种创建客户端验证打开的 ssl 连接的方案。

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

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

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

最佳答案

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

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

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

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

关于android:为什么客户端在未由与服务器相同的 CA 签名时不发送 ssl 证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12156404/

相关文章:

android - 为什么安卓:layout_width=”0px” for fragments?

java - 使用 Enum 来检查条件

amazon-web-services - 将 Heroku SSL (ACM) 与 AWS S3/Cloudfront 一起使用

java - Tomcat Web 应用程序需要使用 SSL 客户端身份验证吗?

ssl - 如何将多个握手消息组合到 java 中的一条记录?

Android Studio - 用于导航到 xml 声明的热键是导航到 R 文件

android - 全屏播放视频

java - Android游戏线程生命周期实现

javax.net.ssl.SSLHandshakeException : null cert chain java error

php - 将通配符子域重定向到 https