java - 使用 keytool 删除 keystore 中的别名是否会删除私钥?

标签 java ssl cryptography certificate keytool

那么如果我在 keystore 中有一个公共(public)证书,使用 key 工具删除它会同时删除私钥信息吗?

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

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

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

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

证书使用了之前添加的 root 和 inter,显示正常。

更新:

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

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

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

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

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

最佳答案

查看不同 keystore 条目类型的源代码,一切都很清楚。 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;

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

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

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

关于java - 使用 keytool 删除 keystore 中的别名是否会删除私钥?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39880281/

相关文章:

java - 如何使用 SpringJUnit4ClassRunner 使用 RunNotifier 或 RunListener

java - 日历字段增量给出了意想不到的结果

ios 7.1 企业分发服务器的证书错误

php - 在 Ubuntu 10.04 上使用最新的 OpenSSL Opdate Curl

python - (RSA)我从 stackoverflow 得到的这个脚本返回负 d 值

java - 访问另一个 Web 应用程序中的类

java - 是否可以在 jsp 2.0 自定义标记内获取调用页面名称?

python - python中的这个ssl错误是什么意思?

macos - 在 OS X 上使用 X509Certificate2 时避免使用钥匙串(keychain)

c++ - linux aes256 带 cbc 加密/解密库