android - 证书链长度无效

标签 android ssl certificate ssl-certificate

我们有一个奇怪的情况。在建立连接时,我们的应用程序会执行一系列安全检查。其中之一是检查链条长度是否正确。我们知道应该是3:Root、intermediate、server。

当我们使用 Android 应用程序连接到服务器时,我们得到的响应只有两个中间证书和服务器证书 - 没有根证书。但是当我们执行检查思想网络浏览器时,我们进行了一项研究,在 Android 5.0 上我们看到了 3 个,在 Android 4.3 上我们看到了两个。连接表单 iOS 产生 3 个证书。

是服务器还是Android?我们可以做些什么来获得根证书?

编辑: 我们从浏览器下载证书(根证书和中间证书)并从中创建一个 keystore 并将其放入应用程序 Assets 中。然后在我们的 CustomTrustManager 中,我们将 keystore 中的证书与来 self 们连接的服务器的证书进行比较。

基本上我们的比较是基于证书指纹。问题是根证书不是来自服务器,无法比较它。

但我们提出了这个想法。

我们可以比较来自服务器的中间证书是由应用程序中硬编码的根证书签名的。

我认为这足够安全。

而且我们将只比较中间指纹。

最佳答案

我不知道你是如何进行检查的,但总的来说:

  • 服务器必须将服务器证书和从服务器证书引出的所有中间证书发送到内置根 CA。如果链证书缺失,某些浏览器(如桌面版 Chrome)会尝试填写缺失的证书,而其他浏览器(如大多数非浏览器的应用程序)则无法通过验证,因为无法创建信任链。
  • 服务器不应该自己发送根 CA,但有些服务器还是会发送。在这种情况下,服务器发送的根 CA 将被忽略。
  • 根据存储在浏览器/系统中的根 CA,可能会有不同的信任路径,通常也有不同的长度。当涉及交叉签名时尤其如此,这通常是引入新的根 CA 时的情况。由于这些最初不在浏览器/系统 CA 存储中,因此它们由信任存储中的另一个 CA 签名,但后来新的根 CA 位于信任存储中,因此链更短。此过程目前还用于将使用 1024 位 RSA 的各种根 CA 替换为使用更强大 key (即 4096 位)的根 CA。

这意味着您看到的链长取决于很多因素:

  • 你怎么看:你看的是服务器发送的链还是系统构造的链?后者将包含根 CA,而第一个不应该但可能包含。
  • 系统上存在哪些根 CA:较旧的系统可能会构建更长的链,因为较新的根 CA 或尚未在系统中。

关于android - 证书链长度无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32130370/

相关文章:

c# - SSL 证书验证 .NET 与 Mono

ssl - 如何使用 Datadog 监控 ssl 证书?

google-chrome - 使用自签名证书对本地服务器的 https 调用在 chrome 上被阻止(适用于 FF)

android - dex文件的endian_tag

android - 在 android studio 中找不到 proguard-project.txt

android - 如何制作实现可点击的自定义 RelativeLayout?

Silverlight 4 - 配置自承载 WCF 服务以使用 SSL

apache - https下的GeoServer

javascript - 如何在 .NET 或 JavaScript 中使用 MS-XCEP 和 MS-WSTEP 从 AD CS 获取证书?

android - 错误 :Failed to find: com. google.guava :guava:18. 0.+