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

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

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

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

【问题讨论】:

    标签: java ssl certificate keystore


    【解决方案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 签名的密钥,如果有多个,则使用第一个。但我不能肯定地说。

    【讨论】:

      猜你喜欢
      • 2011-12-28
      • 2013-01-16
      • 1970-01-01
      • 2011-08-17
      • 2021-02-19
      • 2013-01-02
      • 1970-01-01
      • 2019-08-29
      • 2016-04-15
      相关资源
      最近更新 更多