为什么可以在不提供密码的情况下指向使用自定义密码的信任库?

Why is it possible to point to a truststore that uses a custom password without providing the passwort?

我有一个非常简单的场景:

public class Main {
    public static void main(String[] args) {
        System.setProperty("javax.net.debug", "ssl"); 
        System.setProperty("javax.net.ssl.trustStore", "H:/data/serverkeystore.jks");
        System.setProperty("javax.net.ssl.trustStorePassword", "somestuff");
        try {
            ServerSocketFactory ssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
            SSLServerSocket serverSocket = (SSLServerSocket) ssf.createServerSocket(1337);
    ... code goes on here ...

注释掉

行没关系
System.setProperty("javax.net.ssl.trustStorePassword", "somestuff");

出还是我用。在 this 问题的答案中,很好地描述了密码的用途(即使那里缺少源信息)并且如果不提供密码,则无法验证 TrustStore 的完整性。因此,在我的示例代码中,如果您取消注释该行,Java 将使用 TrustStore 而不检查其完整性。通过我自己的测试,我可以确定如果我输入了错误的密码并使用代码,如上所示,它会出现错误消息(这是期望的结果)。我很惊讶可以省略密码,然后 Java 显然可以与未经检查的 TrustStore 一起使用。谁能针对我的问题解释一下TrustStore的初始化例程?

正如问题中已经提到的,我使用自己的 TrustStore 密码,这与标准密码不同 "changeit"。

它甚至取决于 SPI (JCE) 实现,实际上您不需要任何密码即可列出 JKS 存储。

证书不是机密的,但您不希望任何人篡改系统应该信任的证书列表(例如提供 rogue/false 根 CA)。

应该有一种方法来加强对信任库的信任(密码应该是 验证)。如果您提供错误的密码,它会失败吗?

Yes it will fail, and if you don't provide a password you can't update the truststore

的确,这是预期的行为。对于 JKS 密钥库,您可以列出没有任何密码的条目和证书,但无法验证完整性。无论如何,您应该为您的应用程序提供一个密码,以确保没有人 sc..wd 使用您的信任库。