您是否需要密码才能访问信任库(使用java keytool制作)?

six*_*ude 29 java keystore keytool truststore

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

java -Djavax.net.ssl.trustStore=<PATHSTUFF>/client.keystore -classpath <STUFF> Client
Run Code Online (Sandbox Code Playgroud)

(注意:没有指定密码)

以上呼叫有效.


但是,当我尝试这个:

java -classpath <STUFF> Client
Run Code Online (Sandbox Code Playgroud)

这是行不通的.(显然它不起作用,它需要信任库).


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

-Djavax.net.ssl.trustStorePassword=mypass
Run Code Online (Sandbox Code Playgroud)

问题:您是否需要密码才能访问信任库?密码只是用于修改吗?密钥库怎么样?

Pas*_*ent 39

密码用于保护密钥库的完整性.如果您不提供任何商店密码,您仍然可以阅读密钥库的内容.该命令keytool -list演示了此行为(使用空密码).

  • 这个答案是关于KeyStore的,但主要问题是关于TrustStore.我糊涂了. (5认同)

jav*_*ett 18

除了@ pascal-thivent的优秀答案:

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

当然,如果您具有使用keytool(它不是setuid)更新密钥库文件的写访问权限,则可以使用未检查密码的其他工具替换内容.我们知道商店及其格式在没有密码的情况下是可读的,所以我们可以写出我们想要的东西.

这就是验证密码进入的地方.当写出商店条目时,提供的商店密码用于计算商店内容的摘要,由密码加密.这是单向散列/摘要,因此如果没有密码,则无法验证商店内容是否已被篡改.同样,不知道密码的恶意用户也无法修改商店的内容并产生由该密码产生的摘要哈希.

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

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

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

请注意,虽然通常使用术语密钥库,但它同样指密钥库信任.通常,密钥库通常是身份存储,并且包含身份及其秘密私钥,例如由运行HTTPS的服务器使用.一个信任往往只包含公钥和没有私人密钥,所以没有秘密,但重要的是要确定是什么身份的一种客户信任.