我们可以在密钥库中加载多个证书和密钥吗?

Posted

技术标签:

【中文标题】我们可以在密钥库中加载多个证书和密钥吗?【英文标题】:Can we load multiple Certificates & Keys in a Key Store? 【发布时间】:2011-09-16 06:40:07 【问题描述】:

是否总是只需要加载 Pairs(即证书和密钥一起)?

如果一个 Key Store 有多个证书和密钥,当 Java SSL 尝试作为服务器建立连接时会选择哪一个?

【问题讨论】:

【参考方案1】:

虽然这取决于 KeyStore 类型,但通常您可以在一个存储中存储多个私钥和证书。

用于基于 Java 的服务器的密钥和证书组合将取决于应用程序的实现方式。许多应用程序允许您使用 别名 名称选择给定的证书。 KeyStore 中的密钥和证书获取器采用 alias 参数来进行此选择。通常,当配置中没有指定时,应用程序或框架将使用它根据KeyStore.aliases() 枚举找到的第一个合适的。

例如,Tomcat 在其Connector configuration 中使用keyAlias 属性:

keyAlias:用于服务器的别名 密钥库中的证书。如果不 指定读取的第一个键 将使用密钥库。

关于密钥对,一些 KeyStore(同样取决于类型)可用于存储 SecretKeys(例如 DES),即共享密钥以及公私密钥对。

【讨论】:

感谢您的回答。所以,基本上在 Java SSL 中,如果想使用证书,那么首先我必须通过 Keytool 或以编程方式将它们加载到 KeyStore 中,然后从密钥中读取证书和私钥条目存储并将它们传递给 SSL?但是,哪个 API 允许我指定 SSL 服务器应该使用哪个证书? 除非你使用的框架可以为你做这件事,否则你需要配置一个 KeyManager 并从中初始化和 SSLContext (然后使用该上下文来构建你的套接字工厂)。这是KeyManager to specify an alias 的示例。 @Bruno :您确定它会查看此别名吗?因为 alias 是您为在密钥库中标识该条目而提供的名称。为了选择它应该发送给客户端的证书,它将查看证书(CN)的域并根据它做出决定。如果在任一证书的 (CN) 中找到所请求的域,则该证书将被发送给客户端。 @KrzysztofSzewczyk 别名对于 KeyStore 而言是唯一的标识符,因此当您导入它时可能会覆盖另一个。 (证书本身没有别名,它只是 KeyStore 中的一个插槽。)请参阅:this question。 @Bruno 我理解 - 但向最终用户解释...他在当前证书到期日期前一个月购买了具有相同别名的新证书。很高兴这个解决方案解决了我的问题:link【参考方案2】:

您可以拥有一个包含任意数量的证书和密钥的密钥库。

如果客户端用作其信任库的密钥库中有多个证书,则会查看所有证书,直到找到适合的证书。您可以查看预安装的证书,它们位于 /lib/security/cacerts 中。这只是根 CA 证书的大集合。

关于我不知道的键。我认为客户端使用由与服务器提供的证书相同的 CA 签名的密钥,如果有多个,则使用第一个。但我不能肯定地说。

【讨论】:

以上是关于我们可以在密钥库中加载多个证书和密钥吗?的主要内容,如果未能解决你的问题,请参考以下文章

了解密钥库、证书和别名

密钥库证书的 SHA-1 指纹

密钥库证书的 SHA-1 指纹

密钥库证书的 SHA-1 指纹

密钥保管库上的 Azure 自签名证书

如何以编程方式在 OpenSSL 中加载 PKCS#12 文件?