您是否需要密码才能访问信任库(使用java keytool)?

我刚刚使用java keytool创建了一个信任库(用于没有CA证书的服务器的服务器身份validation)。 但是我只是注意到一些奇怪的事 我这样开始我的客户:

java -Djavax.net.ssl.trustStore=/client.keystore -classpath  Client 

(注意:没有指定密码)

以上呼叫有效。


但是,当我尝试这个:

 java -classpath  Client 

这是行不通的。 (显然它不起作用,它需要信任库)。


我本来希望传递这个选项(但我没有):

 -Djavax.net.ssl.trustStorePassword=mypass 

问题 :您是否需要密码才能访问信任库? 密码只是用于修改吗? 密钥库怎么样?

密码用于保护密钥库的完整性。 如果您不提供任何商店密码,您仍然可以阅读密钥库的内容。 命令keytool -list演示了这种行为(使用空密码)。

除了@ pascal-thivent的优秀答案:

密钥库密码有两个用途 – 如果没有提供, keytool拒绝让您用新内容替换商店的内容,例如删除现有或添加新证书条目。

当然,如果您具有使用keytool更新密钥库文件的写访问权限(它不是setuid),您可以使用另一个未检查密码的工具替换内容。 我们知道商店及其格式在没有密码的情况下是可读的,所以我们可以写出我们想要的东西。

这就是validation密码进入的地方。 当写出商店条目时,提供的商店密码用于计算商店内容的摘要,由密码加密。 这是单向散列/摘要,因此如果没有密码,您无法validation商店内容是否已被篡改。 同样,不知道密码的恶意用户也无法修改商店的内容并产生由该密码产生的摘要哈希。

这就是为什么当您提供无密码时, keytool警告您无法validation商店是否未被篡改。 如果您提供的密码无效 ,或者商店被篡改,您将收到不同的消息:

Enter keystore password: keytool error: java.io.IOException: Keystore was tampered with, or password was incorrect

keytool无法根据您提供的当前商店内容和密码重新创建现有的哈希摘要,因此密码不正确,或密钥库被泄露 – keytool无法分辨,但它假定您或者软件读取商店知道。

请注意,虽然通常使用术语密钥库 ,但它同样指的是密钥库信任 。 通常, 密钥库通常是身份存储,并且包含身份及其秘密私钥,例如由运行HTTPS的服务器使用。 信任库通常只包含公钥而不包含私钥,因此没有秘密,但对于确定客户端信任的身份很重要。

默认情况下,JRE信任库密码为“changeit”。 如果要使用Java以编程方式更改默认信任库(cacerts)密码,请通过此链接 。

如果未指定信任库,则使用默认值。 我假设,您收到错误,您需要指定信任库以信任您请求的主机? 默认信任库位于$ JAVA_HOME / lib / security / jssecacerts中。