访问使用Java Keytool创建的信任存储库时,是否不需要密码?

41

我刚刚使用Java keytool创建了一个信任存储库(用于服务器身份验证,服务器没有CA证书)。然而,我刚刚注意到一些奇怪的事情。我是这样启动客户端的:

java -Djavax.net.ssl.trustStore=<PATHSTUFF>/client.keystore -classpath <STUFF> Client

(注意:没有指定密码)

上述调用有效。


然而,当我尝试这样做时:

java -classpath <STUFF> Client

它不起作用。(显然它需要信任库)。


我原本以为需要传递这个选项(但我没有这样做):

-Djavax.net.ssl.trustStorePassword=mypass
问题: 访问信任库不需要密码吗?密码只用于修改吗?那密钥库呢?

@Pascal,是的。我使用的服务器没有CA证书,因此需要一个信任存储库,以便它可以为服务器执行SSL身份验证。 - sixtyfootersdude
5
我也不明白为什么在 SSL 的客户端部分 TrustStore 中需要密码,特别是当没有 CA 参与时。你解决了吗? - AlikElzin-kilaka
4个回答

46

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


1
@sixtyfootersdude 是的,虽然没有检查完整性,但你仍然可以访问密钥库。 - Pascal Thivent
12
这篇回答是关于KeyStore的,但主要问题是关于TrustStore的。我感到混淆了。 - AlikElzin-kilaka

36

除了pascal-thivent提供的优秀答案之外:

密钥库密码有两个目的——如果没有提供,则keytool会拒绝使用其他新内容替换存储区的内容(例如删除现有条目或添加新的证书条目)。

当然,如果您有写入许可权来使用keytool更新密钥库文件(它不是设置为setuid),则可以使用另一个未检查密码的工具替换内容。我们知道,存储和其格式可以在没有密码的情况下进行读取,因此我们可以在那里写入我们想要的内容。

这就是验证密码的作用。当存储条目被写出时,提供的存储密码用于计算存储内容的摘要,由密码加盐。这是一种单向哈希/摘要,因此如果没有密码,您无法验证存储内容是否已被篡改。同样,恶意的人如果不知道密码也无法修改存储的内容并产生该密码会产生的数字摘要哈希。

这就是为什么当您不提供密码时,keytool只会警告您无法验证存储是否已被篡改。如果您提供了一个无效密码,或者存储已经被篡改,您将收到不同的消息:

Enter keystore password:
keytool error: java.io.IOException: Keystore was tampered with, or password was incorrect
keytool无法根据当前存储内容和您提供的密码重新创建现有的哈希摘要,因此可能是密码不正确或密钥库已被破坏 - keytool无法确定,但假设您或读取该存储的软件知道。
请注意,尽管通常使用术语keystore,但它同样适用于keystorestruststores。 更具体地说,keystore更常见是一个身份存储库,包含身份和其秘密私钥,例如由运行HTTPS的服务器使用。 一个truststore更经常只包含公钥而没有私钥,因此没有秘密,但重要的是确定客户端信任哪些身份。

1
非常好的答案。我也注意到不同类型的存储方式对密码的处理方式是不同的。如果在JKS类型中不提供密码,只会导致无法检查存储完整性,而如果在PKCS12密钥库中不提供密码,则会在使用keytool -list时得到空列表,因此如果您不知道密码,则无法使用该存储。 - Alexey R.

1

默认情况下,JRE信任存储库密码为“changeit”。如果您想使用Java编程方式更改默认的信任存储库(cacerts)密码,请查看this link


-3
如果您没有指定信任存储库,将使用默认的存储库。我猜想,您会收到一个错误提示,需要指定信任存储库以信任您请求的主机?默认的信任存储库位于$JAVA_HOME/lib/security/jssecacerts。

3
嗨,bfoo,是的,我知道那是默认设置,但那并没有回答我的问题。显然默认设置不起作用,而我指定的那个起作用了。我的问题是:为了读取信任商店,需要密码吗?有默认密码吗? - sixtyfootersdude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接