您是否不需要密码即可访问信任库(使用java密钥工具制作)?

2022-09-01 04:23:04

我刚刚使用java keytool创建了一个信任库(用于没有CA证书的服务器的服务器认证)。然而,我只是注意到一些奇怪的东西。我是这样开始我的客户端的:

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

(注意:没有指定密码)

上述调用有效。


但是,当我尝试此操作时:

java -classpath <STUFF> Client

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


我本来以为需要通过这个选项(但我没有):

-Djavax.net.ssl.trustStorePassword=mypass

:访问信任库不需要密码吗?密码仅用于修改吗?密钥库呢?


答案 1

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


答案 2

除了pascal-thivent的出色回答

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

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

这就是验证密码的用武之地。写出存储条目时,提供的存储密码用于计算存储内容的摘要,如密码所示。这是一个单向哈希/摘要,因此如果没有密码,您将无法验证存储内容是否已被篡改。同样,不知道密码的恶意用户也无法修改存储的内容并生成由该密码生成的摘要哈希。

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

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

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

请注意,虽然术语“密钥库”通常使用,但它同样指密钥库信任库。不太一般地说,密钥库更经常是一个身份存储,包含身份及其秘密,私钥,例如由运行HTTPS的服务器使用。信任库通常只包含公钥,不包含私钥,因此不包含机密,但对于确定客户端信任哪些身份非常重要。


推荐