我刚刚创建了一个带有java keytool的信任库(用于没有CA证书的服务器的服务器身份验证).但是我只是注意到一些奇怪的事 我这样开始我的客户:
java -Djavax.net.ssl.trustStore=/client.keystore -classpath Client
(注意:没有指定密码)
以上呼叫有效.
但是,当我尝试这个:
java -classpathClient
这是行不通的.(显然它不起作用,它需要信任库).
我本以期需要传递这个选项(但我没有):
-Djavax.net.ssl.trustStorePassword=mypass
问题:您是否需要密码才能访问信任库?密码只是用于修改吗?密钥库怎么样?
密码用于保护密钥库的完整性.如果您不提供任何商店密码,您仍然可以阅读密钥库的内容.该命令keytool -list
演示了此行为(使用空密码).
除了@ pascal-thivent的优秀答案:
密钥库密码有两个用途 - 如果未提供,则keytool
拒绝让您使用新内容替换商店的内容,例如删除现有或添加新证书条目.
当然,如果您具有使用keytool
(它不是setuid)更新密钥库文件的写访问权限,则可以使用未检查密码的其他工具替换内容.我们知道商店及其格式在没有密码的情况下是可读的,所以我们可以写出我们想要的东西.
这就是验证密码进入的地方.当写出商店条目时,提供的商店密码用于计算商店内容的摘要,由密码加密.这是单向散列/摘要,因此如果没有密码,则无法验证商店内容是否已被篡改.同样,不知道密码的恶意用户也无法修改商店的内容并产生由该密码产生的摘要哈希.
这就是为什么当您提供无密码时,keytool
只是警告您无法验证商店是否未被篡改.如果您提供的密码无效,或者商店已被篡改,您将收到不同的消息:
Enter keystore password:
keytool error: java.io.IOException: Keystore was tampered with, or password was incorrect
keytool
无法根据您提供的当前商店内容和密码重新创建现有的哈希摘要,因此密码不正确,或密钥库被泄露 - keytool
无法分辨,但它假设您或读取商店的软件知道.
请注意,虽然通常使用术语密钥库,但它同样指密钥库和信任库.通常,密钥库通常是身份存储,并且包含身份及其秘密私钥,例如由运行HTTPS的服务器使用.一个信任往往只包含公钥和没有私人密钥,所以没有秘密,但重要的是要确定是什么身份的一种客户信任.