Keystore 密钥库:为什么getCertificateChain(..)不需要密码,而getKey需要密码?

Keystore 密钥库:为什么getCertificateChain(..)不需要密码,而getKey需要密码?,keystore,Keystore,我正在使用Java密钥库,查看了API,但我不明白为什么会这样做 Certificate[] chain = ks.getCertificateChain(alias) 检索证书链时不需要密码 PrivateKey pk = (PrivateKey) ks.getKey(alias, PASSWORD); 需要密码吗 我读过这篇文章,但没有看到什么证书不需要密码。我的特定证书同时具有公钥和私钥。我可以理解为什么具有公钥的证书不需要密码。我不明白为什么每次访问密钥库时,都不需要输入密码作为参

我正在使用Java密钥库,查看了API,但我不明白为什么会这样做

Certificate[] chain = ks.getCertificateChain(alias) 
检索证书链时不需要密码

PrivateKey pk = (PrivateKey) ks.getKey(alias, PASSWORD);
需要密码吗

我读过这篇文章,但没有看到什么证书不需要密码。我的特定证书同时具有公钥和私钥。我可以理解为什么具有公钥的证书不需要密码。我不明白为什么每次访问密钥库时,都不需要输入密码作为参数


肤浅:您需要一个密码来获取私钥值,因为私钥值是用密码加密的,以保持私钥,因为私钥应该是私钥。您不需要密码来解密证书,即使是privatekey条目中的密码,因为证书没有加密,因为它不需要是私有的。啊,你说,但是为什么证书不必是私人的呢

基础:公钥密码的定义特征和主要特征是公钥始终可以并且通常是公开的,并且系统(如果正确实现和使用)仍然是安全的。由于公钥证书的主要目的是真实地传递公钥,而不是秘密地传递公钥,因此它几乎总是被视为公共的,尽管在实践中,证书有时包含可能有些敏感的其他信息

例如,当HTTPS客户端(如web浏览器)连接到网站时,服务器必须提供其证书,并且通常(大部分)提供其证书链,以便客户端可以验证服务器是否有效并保护密钥交换。任何人只要能看到网络上的流量(包括合法的东西,如路径中的路由器),就可以随时看到这些证书。对于大多数服务器来说,几乎任何潜在客户都可以获得这些证书,即使不允许实际的web请求或交易。如果您希望人们向您发送加密的S/MIME电子邮件,您需要向他们发送您的证书或将证书发布到任何发件人都可以访问的位置,以便确保您使用正确的加密密钥。当您发送签名的S/MIME电子邮件时,您需要包含或发布您的证书,以便收件人可以验证您的电子邮件,除非收件人已经拥有这些证书,在这种情况下,这些证书以前已发送或发布。这些过程通常允许除实际需要的发送者和接收者之外的许多人查看您的证书,尽管并非所有人都可以。如果您想签署代码,您必须同样提供或提供您的证书,以供收件人用于验证签名;特别是对于签名小程序(Java设计案例),这通常会使世界上很大一部分人看到您的证书

证书不应包含私钥。X.509定义的格式没有放置私钥的位置,并且不允许也不能使用适当的CA。如果您运行自己的非标准CA,并定义自己的非标准扩展,这些扩展违反了长期以来的共识实践,使自己不安全,恭喜您,您成功了

您通常拥有并且应该拥有的是一个privatekey条目,其中包含一个私有/加密的privatekey值,以及一个或多个证书,这些证书与第一个(或唯一一个)证书构成一个链,该证书包含与privatekey匹配的公钥(并且在生成过程中实际上是从该公钥派生的)。这就是
java.security.KeyStore
定义
PrivatKeyEntry
的方式。您可以获得证书链或第一个证书,而无需密码。您需要密码才能从privatekey条目访问privatekey值

文件密码:以上所有内容都用于内存中的密钥库。如果您将密钥库写入文件(至少使用默认提供程序),则该密钥库的完整性受哈希保护,哈希由您必须提供的文件密码(称为
keytool
中的存储密码)键入;当读回文件时,是否提供此密码以验证完整性是可选的