我正在使用Java Keystore,查看了API,但我无法弄清楚为什么会这样做
Certificate[] chain = ks.getCertificateChain(alias)
时不需要密码来检索证书链
PrivateKey pk = (PrivateKey) ks.getKey(alias, PASSWORD);
需要密码吗?
我已经读过这篇文章,但是看不出证书不需要密码。我的特定证书包含公钥和私钥。我能理解为什么拥有公钥的证书不需要密码。我不明白为什么每当我访问密钥库时,我都不需要输入密码作为参数。
http://docs.oracle.com/javase/7/docs/api/java/security/cert/Certificate.html
答案 0 :(得分:2)
表面:您需要一个密码才能获取私钥值,因为私钥值使用密码加密以保持私密,因为私钥应该是私有的。您不需要密码来解密证书,即使是私钥条目中的密码,因为证书未加密,因为它不需要是私有的。啊,你说,但为什么不需要证书是私有的?
基础:公钥加密的定义特征和主要特征是publickey总是可以并且通常是公共的,并且系统(如果正确实现和使用)仍然是安全的。由于公钥的证书的主要目的是真实地但保密传达公钥,因此它几乎总是被视为公共的,尽管在实践中证书有时包含< em>其他信息可能有些敏感。
例如,当Web客户端等HTTPS客户端连接到网站时,服务器必须提供其证书,并且通常(大部分)其证书链,以便客户端可以将服务器认证为有效并保护密钥交换。任何能够看到网络流量的人(包括路径中的路由器之类的合法内容)都可以看到这些证书,并且即使不允许实际的Web请求或交易,也可以通过或多或少的任何潜在客户端获得大多数服务器。如果您希望人们向您发送加密的S / MIME电子邮件,您需要向他们发送您的证书或在任何发件人可以访问的地方发布证书,这样可以确保使用正确的加密密钥您。当您同样发送签名的S / MIME电子邮件时,您需要包含或发布您的证书,以便收件人可以验证您的电子邮件 - 除非收件人已经拥有它们,在这种情况下,它们是先前发送或发布的。这些过程通常允许除了实际需要或需要的发件人和收件人之外的许多人(尽管并不总是完全是每个人)都能看到您的证书。如果您想签署代码,您必须同样提供或提供您的证书,以便收件人用于验证签名;特别是对于签署 applets (Java的设计案例),这通常会使您的证书在世界上很大一部分上可见。
证书永远不应包含私钥。 X.509定义的格式没有位置,并且既不允许也不能包含适当的CA.如果您运行自己的非标准CA并定义自己的非标准扩展,这些扩展违反了长期存在的共识惯例,使您自己不安全,恭喜您,您已经成功了。
您通常拥有和应拥有的是包含私钥值的私钥条目,该私钥/加密值以及一个或多个证书正在形成包含匹配的公钥的第一个(或唯一)证书的链(并且在生成期间实际上派生自)私钥。这就是java.security.KeyStore
定义PrivatKeyEntry
的方式。您可以获得没有密码的证书链或第一个证书。您需要一个密码才能从私钥条目访问私钥值。
文件密码:以上所有内容均适用于内存中的KeyStore。如果您将KeyStore写入文件(至少使用默认提供程序),则完整性受文件密码(称为存储区)键入的哈希保护您必须提供的keytool
)密码;当读回文件时,是否提供此密码以验证完整性是可选的。