证书链长度无效

时间:2015-08-21 00:02:40

标签: android ssl certificate ssl-certificate

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

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

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

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

基本上我们的比较基于证书指纹。问题是根证书不是来自服务器,也没有能力进行比较。

但我们提出了这个想法。

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

我认为这是足够安全的。

我们只会比较中间指纹。

1 个答案:

答案 0 :(得分:1)

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

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

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

  • 你看起来如何:你看看服务器发送的链或系统构建的链?后者将包含根CA,而第一个不应该包含根CA.
  • 系统中存在哪个根CA:旧系统可能构建更长的链,因为较新的根CA或尚未在系统中。