使用keytool删除密钥库中的别名是否会删除私钥?

时间:2016-10-05 17:27:44

标签: java ssl cryptography certificate keytool

因此,如果我有一个公共证书,坐在密钥库中将使用密钥工具删除它也删除私钥信息?

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

我认为Alias可以是你做的任何东西,删除别名指定的证书会删除证书本身和相应的私钥吗?

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

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

证书是我们之前添加的root和inter,显示确定。

更新

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

回到我原来的一个问题,证书是否可以在不同的别名下再次导入,并且仍然与商店中的私钥相匹配?根据信息ID说不,它需要使用先前为私钥设置的别名。

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

我的问题是导入的证书显示为trustedcert条目,因此我猜测它与商店中的私钥不匹配。

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

2 个答案:

答案 0 :(得分: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中。作为组合证书和密钥并将其链接到一个别名,重命名别名将影响密钥和证书。

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

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

答案 1 :(得分:1)

  

我认为别名可以是你做的任何事情,删除别名指定的证书会删除证书本身和相应的私钥吗?

是的,PrivateKeyEntry始终包含私钥和匹配的证书。也可以选择发行人证书。

  

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

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

  

同样的证书也可以在不同的别名下导入并且仍然可以工作(即与私钥匹配)?

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

  

回到我原来的一个问题,证书是否可以在不同的别名下再次导入,并且仍然与商店中的私钥相匹配?根据信息ID说不,它需要使用先前为私钥设置的别名。

完全。

  

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

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

  

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

是的,请参阅keytool reference

  

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

完全。