何时安装密钥库以及何时仅安装包装在密钥库中的证书

我有一个PKCS#12文件,我认为它是一个密钥库文件,因为它包含一个密钥条目和一个证书条目

在Android中,我看到人们通过以下方式以编程方式安装密钥库(代码来自Android开发人员博客):

byte[] keystore = . . (read from a PKCS#12 keystore)

Intent installIntent = KeyChain.createInstallIntent();
installIntent.putExtra(KeyChain.EXTRA_PKCS12, keystore);
startActivityForResult(installIntent, INSTALL_KEYSTORE_CODE);

我还看到人们以编程方式仅安装包装在密钥库中的证书

Intent intent = KeyChain.createInstallIntent();
intent.putExtra(KeyChain.EXTRA_CERTIFICATE, cert);
startActivity(intent);

此外,我还看到人们同时安装了密钥库和包装在密钥库中的证书。例如,本文向我们展示了如何首先安装密钥库,然后以编程方式安装包装在密钥库中的证书。

我真的对何时应该只安装密钥库以及何时应该只安装证书(包装在密钥库内)感到困惑?我应该什么时候安装两者?有人可以让我清楚这一点吗?

例如,我的密钥库PKCS#12文件(mycert.p12)包含密钥/证书对,它用于连接到VPN服务器。我的 Android 客户端何时应该同时安装密钥库和包装在密钥库中的证书?客户端何时应仅安装包装在密钥库中的证书?有什么区别?我对此感到非常困惑。


答案 1

我有一个PKCS#12文件,我认为它是一个密钥库文件,因为它包含一个密钥条目和一个证书条目。

正确。

在Android中,我看到人们以编程方式安装密钥库,如下所示...

这是当您有密钥库(即密钥对和证书)时完成的。

我还看到人们以编程方式仅安装包装在密钥库中的证书

当您拥有其他人的证书(通常是自签名证书)时,可以完成此操作,该证书不受已安装的任何默认 CA(证书颁发机构)的信任。你永远不必这样做。

因此请注意,您永远不会使用相同的证书执行这两项操作,因为情况(所有权)不同。毫无疑问,哪种过程是合适的。如果是你的,请导入密钥库。如果是其他人的,请导入证书。

所有这些东西的最终规范性参考是国际电联X.509建议书

最后,关于您链接的低质量博客文章的一些注释。

在 ICS 中统一密钥存储访问

过去,如果应用需要对安全的 SSL Web 服务器进行身份验证,或者通过客户端证书向服务器验证用户身份,则应用通常会维护自己的密钥存储。

这已经是不正确的。

  1. 要对 Web 服务器进行身份验证,如果它具有 CA 签名的证书,则不需要任何内容。如果它具有自签名证书,则需要将其导入到信任库中

  2. Web 服务器验证自己的身份,您需要一个包含您自己的私钥和证书(最好是 CA 签名证书)的密钥库。否则,服务器必须将自签名证书导入其信任库,即上述 (1) 的反义词。不要走这条路。自签名证书的麻烦远远超过它们的价值,这没什么,正如您为它们支付的价格所证明的那样。

使用 ICS 钥匙串 API

我们首先使用密钥别名获取私钥和证书链,然后创建并验证签名以检查密钥是否实际可用。

完全是胡说八道。我们已经有了私钥、公钥和证书。它们已经可用。创建签名并在本地验证它完全是浪费时间。

安装 CA 证书与安装 PKCS#12 文件没有太大区别:将证书加载到字节数组中,并将其作为额外内容传递给安装意图。

区别在于您在 CA 证书事例和密钥库事例中使用。KeyChain.EXTRA_CERTIFICATEKeyChain.EXTRA_PKCS12


答案 2

由于还没有人回答你,我希望我至少可以从你链接到的博客文章中澄清一些观点。

过去,如果应用需要对安全的 SSL Web 服务器进行身份验证,或者通过客户端证书向服务器验证用户身份,则应用通常会维护自己的密钥存储。

以下是此处的两个基本用例:

  • 如果使用客户端证书进行身份验证(向服务器证明您是授权客户端),则只能安装证书。
  • 如果尝试验证服务器的身份,则需要验证服务器的证书。在这种情况下,您将需要安装一个密钥库(如果您不使用自签名证书,则可能是一个链)。密钥库中的私钥将用于验证服务器的证书。

您在问题中的第二段代码用于创建证书链(当您不使用自签名证书时):

我们首先使用密钥别名获取私钥和证书链,然后创建并验证签名以检查密钥是否实际可用。由于我们使用的是自签名证书,因此“链”由单个条目组成,但对于由 CA 签名的证书,您需要在返回的数组中找到实际的最终实体证书。

安装 CA 证书与安装 PKCS#12 文件没有太大区别:将证书加载到字节数组中,并将其作为额外内容传递给安装意图。

Intent intent = KeyChain.createInstallIntent();
intent.putExtra(KeyChain.EXTRA_CERTIFICATE, cert);
startActivity(intent);

我希望这个解释有所帮助!:)


推荐