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

时间:2013-11-12 13:05:45

标签: java android certificate ssl-certificate keystore

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

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

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);

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

我真的很困惑我应该何时仅安装密钥库&我应该何时安装证书(包含在密钥库中)?什么时候应该安装?有人可以告诉我这个吗?

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

3 个答案:

答案 0 :(得分:3)

  

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

正确。

  

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

当您拥有密钥库(即密钥对和证书)时,即可完成此操作。

  

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

当您拥有 else的证书(通常是自签名证书)时,即使已安装的任何默认CA(证书颁发机构)不信任该证书,也会执行此操作。你永远不应该这样做。

请注意,您永远不会同时使用相同的证书,因为案例(所有权)是不同的。对于哪种过程是合适的,永远不会有任何疑问。如果是你的,请导入密钥库。如果是别人的,请导入证书。

所有这些内容的最终规范性参考是ITU Recommendation X.509

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

来自Unifying key store access in ICS

  

过去,应用程序通常会维护自己的密钥   存储,如果他们需要验证安全的SSL Web服务器,或   通过客户端证书将用户验证到服务器。

这已经不正确了。

  1. 要验证Web服务器,如果它具有CA签名证书,则不需要任何内容​​。如果它具有自签名证书,则需要将其导入 truststore

  2. 要对自己进行 Web服务器身份验证,您需要一个密钥库,其中包含您自己的私钥和证书,最好是CA签名的证书。否则,服务器必须将您的自签名证书导入其信任库,即与上面的(1)相反。不要走这条路。自签名证书比它们的价值要麻烦得多,这没什么,你可以从你为它们支付的价格中看出来。

  3. 来自Using ICS keychain API

      

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

    完全废话。我们已经拥有私钥,公钥和证书。它们已经可用了。创建签名并在本地验证它只是完全浪费时间。

      

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

    不同之处在于您在CA证书案例中使用KeyChain.EXTRA_CERTIFICATE,在密钥库案例中使用KeyChain.EXTRA_PKCS12

答案 1 :(得分:-1)

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

  

过去,应用程序通常会维护自己的密钥   存储,如果他们需要验证安全的SSL Web服务器,或   通过客户端证书将用户验证到服务器。

这是以下两个基本用例:

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

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

  

我们首先使用密钥别名获取私钥和​​证书链   然后创建并验证签名以检查密钥是否实际   可用。由于我们使用的是自签名证书'链'   由一个条目组成,但是由CA签名的证书   将需要在返回的实际终端实体证书中找到   阵列。

     

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

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

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

答案 2 :(得分:-1)

关于Android或任何其他客户',即应用程序,以下保留 -

只要需要验证服务器在SSL通信期间发送的证书(或证书链),就需要信任库(仅限公钥)(在ssl通信的情况下,服务器将始终向其提供证书)客户端)。

如果服务器的证书已由受信任的证书颁发机构签名(暗示该证书已存在于通常可在$JAVA_HOME/jre/lib/security/cacerts下找到的java-runtime-truststore中),则此步骤为除非使用自定义的SSLContext,否则不需要(这也意味着正在使用自定义的TrustManager)。

例如,SO&#39>当前证书由DigiCert签署,由SHA1-Thumbprint识别:5F:B7:EE:06:33:E2:59:DB:AD:0C:4C:9A:E6:D3: 8F:1A:61:C7:DC:25并且可能存在于“cacerts”中。别名下的truststore' digicerthighassuranceevrootca'。如果java客户端向https://stackoverflow.com发出请求,则默认情况下不会有任何特定的密钥库或信任库进行通信。

当客户端需要对正在发布到服务器的某些数据进行数字签名时,通常需要密钥库(私钥和公钥)。 一个常见的例子是xml-signing,你可以找到提及here

如果服务器希望客户端在双向ssl握手中提供自己的身份验证证书,则也需要它。从我所遇到的情况来看,这并不常见。

链接:

Two Way SSL

SO's own Keystore and truststore post