我刚刚使用java keytool创建了一个信任库(用于没有CA证书的服务器的服务器身份验证)。但是我只是注意到一些奇怪的事我这样开始我的客户:
java -Djavax.net.ssl.trustStore=<PATHSTUFF>/client.keystore -classpath <STUFF> Client
(注意:没有指定密码)
上述通话有效。
然而,当我尝试这个时:
java -classpath <STUFF> Client
它不起作用。 (显然它不起作用,它需要信任库)。
我原本希望传递这个选项(但我没有):
-Djavax.net.ssl.trustStorePassword=mypass
问题:您是否需要密码才能访问信任库?密码只是用于修改吗?密钥库怎么样?
答案 0 :(得分:37)
密码用于保护密钥库的完整性。如果您不提供任何商店密码,您仍然可以阅读密钥库的内容。命令keytool -list
演示了此行为(使用空密码)。
答案 1 :(得分:15)
除了@ 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 ,但它同样指 keystore 和 truststores 。通常,密钥库通常是身份存储并且包含身份及其秘密私钥,如所使用的那样。由运行HTTPS的服务器。 truststore 通常只包含公钥而没有私钥,所以没有秘密,但确定客户端信任的身份非常重要。
答案 2 :(得分:-2)
如果未指定信任库,则使用默认信任库。我假设,您收到错误,您需要指定信任库以信任您请求的主机?默认信任库位于$ JAVA_HOME / lib / security / jssecacerts。
答案 3 :(得分:-2)
默认情况下,JRE信任存储密码为“changeit”。如果要使用Java以编程方式更改默认信任库(cacerts)密码,请通过this link。