【问题标题】:Do you not need a password to access a truststore (made with the java keytool)?您不需要密码来访问信任库(使用 java keytool 创建)吗?
【发布时间】:2023-12-13 00:46:01
【问题描述】:

我刚刚使用 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 身份验证。
  • 我也不明白为什么 TrustStore 需要密码,它是 SSL 的客户端部分。具体来说,当不涉及 CA 时。你解决了这个问题吗?

标签: java keystore keytool truststore


【解决方案1】:

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

【讨论】:

  • @sixtyfootersdude 是的,没有检查完整性,但您仍然可以访问密钥库。
  • 这个答案是关于 KeyStore 但主要问题是关于 TrustStore。我很困惑。
【解决方案2】:

除了pascal-thivent's excellent answer

密钥库密码有两个用途 - 如果未提供,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 更常见的是 identity store 并包含身份及其秘密、私钥,例如使用的通过运行 HTTPS 的服务器。 truststore 通常只包含公钥而不包含私钥,因此没有秘密,但对于确定 client 信任哪些身份很重要。

【讨论】:

  • 非常好的答案。我还注意到不同的商店类型以不同的方式处理密码。虽然不提供 JKS 类型的密码只会导致无法检查存储完整性,但不提供 PKCS12 密钥库的密码会导致空列表(使用 keytool -list 时),因此如果您不知道,就没有机会使用存储密码。
【解决方案3】:

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

【讨论】:

  • 嗨,bfoo,是的,我知道这是默认设置,但这并不能回答我的问题。显然,默认值不起作用,而我指定的是。我的问题是:为了读取信任库,您需要密码吗?有默认密码吗?
【解决方案4】:

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

【讨论】: