【问题标题】:Does deleting an alias in a key store using keytool delete the private key?使用 keytool 删除密钥库中的别名会删除私钥吗?
【发布时间】:2017-02-14 06:30:41
【问题描述】:

那么,如果我有一个公共证书存放在密钥库中,使用密钥工具删除它也会删除私钥信息吗?

生成了 CSR,并使用外部 CA 签署了证书,然后导入。

我认为别名可以是您制作的任何内容,删除由其别名指定的证书会删除证书本身和相应的私钥?

是否可以在不影响关键信息的情况下更改别名?同样的证书是否可以在不同的别名下导入并且仍然有效(即与私钥匹配)?

我问的原因是在导入证书时,我希望看到它列为类型 privatekeyentry 而不是它当前显示的trustedcertentry,不知道为什么。

我们之前添加的根证书和中间证书显示正常。

更新:

感谢您的回复。因此,只是为了澄清我的理解并确保我做对了,重命名私钥条目的别名是有效的,因为证书和密钥一起保存在这个别名下。删除私钥条目类型的别名也是如此,这将同时删除证书和密钥。

所以回到我最初的问题之一,证书可以在不同的别名下再次导入,并且仍然与商店中保存的私钥匹配吗?根据信息 id 说不,它需要使用之前为私钥设置的别名。

我认为混淆和复杂性在于私钥永远不会离开密钥存储,它是在创建 CSR 时生成的,因此永远不会与证书同时导入。

我的问题是导入的证书显示为受信任的证书条目,所以我猜它与商店中的私钥不匹配。

执行 CSR 生成时是否指定了私钥的别名?如果是这种情况,是否有可能以不同的别名导入签名证书会导致两者不匹配?我唯一能想到的另一件事是使用了错误的 CSR。

【问题讨论】:

  • 签名证书必须在 CSR 签名后使用与私钥相同的别名重新导入。否则它们将不会关联。

标签: java ssl cryptography certificate keytool


【解决方案1】:

查看不同密钥库条目类型的源代码,一切都很清楚。 Keystore 支持三种类型:

  • KeyStore.PrivateKeyEntry
  • KeyStore.SecretKeyEntry(在此答案中将被忽略,因为我们谈论的是证书和私钥)
  • KeyStore.TrustedCertificateEntry

让我们详细介绍一下:

KeyStore.PrivateKeyEntry 类型包含三个字段:

private final PrivateKey privKey;
private final Certificate[] chain;
private final Set<Attribute> attributes;

不同的是,KeyStore.TrustedCertificateEntry 类型只有两个:

private final Certificate cert;
private final Set<Attribute> attributes;

如果您枚举条目,您只会得到一个证书+密钥的条目。因此,这似乎存储在 PrivateKeyEntry 中。由于将证书和密钥组合在一起并将其链接到一个别名,因此重命名别名将同时影响密钥和证书。

由于密钥库中的每个条目都完全独立于其他条目,因此您可以多次导入相同的密钥和证书,只要每个条目都有自己的唯一别名。

顺便说一句:我记得密钥库甚至允许具有相同别名的多个条目(不知道这是否适用于所有密钥库格式)。在这种情况下,您只能通过其别名访问第一个条目。另一个只有在您枚举所有条目时才能访问。

【讨论】:

    【解决方案2】:

    我认为别名可以是您制作的任何内容,删除由其别名指定的证书会删除证书本身和相应的私钥?

    是的,PrivateKeyEntry 始终包含私钥和匹配的证书。还可以选择颁发者证书。

    是否可以在不影响关键信息的情况下更改别名?

    实际上 KeyStore API 不包含 rename 操作。但是可以使用新别名克隆条目并删除旧条目。 keytool的“-changelias”命令就是这样实现的。

    同样的证书是否可以在不同的别名下导入并且仍然有效(即与私钥匹配)?

    没有。如果您导入具有不属于 PrivateKeyEntry 的别名的证书,则会创建一个 TrustedCertificate 条目。

    所以回到我最初的问题之一,证书可以在不同的别名下再次导入,并且仍然与商店中保存的私钥匹配吗?根据信息 id 说不,它需要使用之前为私钥设置的别名。

    没错。

    我认为混淆和复杂性在于私钥永远不会离开密钥库,它是在创建 CSR 时生成的,因此永远不会与证书同时导入。

    不,私钥是使用“-genkeypair”命令生成的(连同自签名证书),CSR 是使用“-certreq”命令生成的。这两个命令都需要一个别名参数。

    执行 CSR 生成时是否指定了私钥的别名?

    是的,请参阅keytool reference

    如果是这种情况,是否有可能以不同的别名导入签名证书会导致两者不匹配?

    没错。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 2016-12-05
      • 2015-09-07
      • 1970-01-01
      相关资源
      最近更新 更多