38

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

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

(注意:没有指定密码)

上述调用有效。


但是,当我尝试这个时:

java -classpath <STUFF> Client

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


我期望需要传递这个选项(但我没有):

-Djavax.net.ssl.trustStorePassword=mypass

问题:访问信任库不需要密码吗?密码只是为了修改吗?密钥库呢?

4

4 回答 4

46

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

于 2010-03-01T16:00:51.960 回答
31

除了pascal-thivent 的出色回答

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

当然,如果您有写入权限来使用keytool(它不是 setuid)更新密钥库文件,您可以使用另一个不检查密码的工具替换内容。而且我们知道存储及其格式无需密码即可读取,因此大概我们可以在那里编写我们想要的内容。

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

这就是为什么当你提供无密码时,keytool只是警告你它无法验证商店没有被篡改。如果您提供的密码无效,或者商店被篡改,您将收到不同的消息:

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

keytool无法根据当前存储内容和您提供的密码重新创建现有的哈希摘要,因此密码不正确或密钥库已泄露 -keytool无法判断,但假设您或读取存储的软件知道.

Note that whilst the term keystore is used generally, it refers equally to keystores and truststores. Less-generally, a keystore is more often an identity store and contains identities and their secret, private keys, as used e.g. by a server running HTTPS. A truststore more often contains only public keys and no private keys, so no secrets, but is important to determine what identities a client trusts.

于 2016-05-20T02:54:38.907 回答
-3

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

于 2010-02-26T20:57:07.270 回答
-3

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

于 2015-04-09T13:56:23.930 回答