我有一个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客户端应该在密钥库中安装密钥库和证书?客户端何时应该在密钥库中安装仅证书?有什么区别 ?我对此很困惑。
答案 0 :(得分:3)
我有一个PKCS#12文件,我认为它是一个密钥库文件,因为它包含一个密钥条目&一个证书条目。
正确。
在Android中,我看到人们通过以下方式以编程方式安装密钥库...
当您拥有密钥库(即密钥对和证书)时,即可完成此操作。
我还看到人们以编程方式只安装包装在密钥库中的证书
当您拥有 else的证书(通常是自签名证书)时,即使已安装的任何默认CA(证书颁发机构)不信任该证书,也会执行此操作。你永远不应该这样做。
请注意,您永远不会同时使用相同的证书,因为案例(所有权)是不同的。对于哪种过程是合适的,永远不会有任何疑问。如果是你的,请导入密钥库。如果是别人的,请导入证书。
所有这些内容的最终规范性参考是ITU Recommendation X.509。
最后,关于您链接的低质量博客文章的一些注释。
来自Unifying key store access in ICS:
过去,应用程序通常会维护自己的密钥 存储,如果他们需要验证安全的SSL Web服务器,或 通过客户端证书将用户验证到服务器。
这已经不正确了。
要验证Web服务器,如果它具有CA签名证书,则不需要任何内容。如果它具有自签名证书,则需要将其导入 truststore 。
要对自己进行 Web服务器身份验证,您需要一个密钥库,其中包含您自己的私钥和证书,最好是CA签名的证书。否则,服务器必须将您的自签名证书导入其信任库,即与上面的(1)相反。不要走这条路。自签名证书比它们的价值要麻烦得多,这没什么,你可以从你为它们支付的价格中看出来。
我们首先使用密钥别名获取私钥和证书链 然后创建并验证签名以检查密钥是否实际 可用的。
完全废话。我们已经拥有私钥,公钥和证书。它们已经可用了。创建签名并在本地验证它只是完全浪费时间。
安装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握手中提供自己的身份验证证书,则也需要它。从我所遇到的情况来看,这并不常见。
链接: