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

yquaqz18  于 2023-06-06  发布在  其他
关注(0)|答案(2)|浏览(687)

那么,如果我在密钥存储中有一个公共证书,使用密钥工具删除它也会删除私钥信息吗?
生成CSR,并使用外部CA对证书进行签名,然后导入。
我认为别名可以是你所做的任何东西,删除由别名指定的证书会删除证书本身和相应的私钥?
是否可以在不影响密钥信息的情况下更改别名?同样的证书是否可以在不同的别名下导入,并且仍然有效(即与私钥匹配)?
我问的原因是,当导入证书时,我希望看到它被列为privatekeyentry类型,而不是trustedcertentry类型,不知道为什么。
证书使用之前添加并显示正常的root和inter。
更新:
谢谢你的回复。因此,为了澄清我的理解并确保我的理解是正确的,重命名私钥条目的别名是有效的,因为证书和密钥一起保存在这个别名下。删除私钥条目类型的别名也是如此,这将删除证书和密钥。
回到我最初的问题之一,证书是否可以在不同的别名下再次导入,并且仍然与存储中持有的私钥匹配?根据信息ID say no,它需要使用之前为私钥设置的别名。
我认为混淆和复杂性在于私钥永远不会离开密钥存储,它是在创建CSR时生成的,因此永远不会与证书同时导入。
我的问题是导入的证书显示为trustedcert条目,所以我猜它与存储中的私钥不匹配。
执行CSR生成时是否指定私钥的别名?如果是这样的话,是否有可能在不同的别名下导入签名的证书会导致两者不匹配?我唯一能想到的是使用了错误的CSR。

2ic8powd

2ic8powd1#

查看不同密钥库条目类型的源代码,一切都很清楚。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中。它结合了证书和密钥,并将其链接到一个别名。重命名别名将影响密钥和证书。
由于密钥库中的每个条目都完全独立于其他条目,因此只要每个条目都有自己的唯一别名,您就可以多次导入相同的密钥和证书。
顺便说一句:我记得密钥库甚至允许有多个相同别名的条目(不知道是否对所有密钥库格式都是如此)。在这种情况下,您只能通过别名访问第一个条目。另一个只有在枚举所有条目时才可访问。

k0pti3hp

k0pti3hp2#

我认为别名可以是你所做的任何东西,删除由别名指定的证书会删除证书本身和相应的私钥?
是的,PrivateKeyEntry始终包含私钥和匹配的证书。可选地,还包括发行方证书。
是否可以在不影响密钥信息的情况下更改别名?
实际上,KeyStore API不包含 rename 操作。但是可以用新别名克隆一个条目并删除旧条目。这就是keytool的“-changelias“命令的实现方式。
同样的证书是否可以在不同的别名下导入,并且仍然有效(即与私钥匹配)?
否。如果导入的证书的别名不属于PrivateKeyEntry,则会创建TrustedCertificate条目。
回到我最初的问题之一,证书是否可以在不同的别名下再次导入,并且仍然与存储中持有的私钥匹配?根据信息ID say no,它需要使用之前为私钥设置的别名。
没错。
我认为混淆和复杂性在于私钥永远不会离开密钥存储,它是在创建CSR时生成的,因此永远不会与证书同时导入。
不可以,私钥是用“-genkeypair”命令生成的(与自签名证书一起),CSR是用“-certreq”命令生成的。这两个命令都需要别名参数。
执行CSR生成时是否指定私钥的别名?
是,请参见keytool参考。
如果是这样的话,是否有可能在不同的别名下导入签名的证书会导致两者不匹配?
没错。

相关问题