为什么可以指向使用自定义密码而不提供密码的信任库



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

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");

在这个问题的答案中,很好地描述了密码的用途(即使源信息丢失(,并且如果没有给出密码,则无法验证TrustStore的完整性。因此,在我的示例代码中,如果取消对该行的注释,Java将在不检查其完整性的情况下使用TrustStore。通过我自己的测试,我可以确定,如果我给出了错误的密码并使用了如上所示的代码,就会出现错误消息(这是所需的结果(。我只是感到惊讶的是,可以省略密码,然后Java显然可以使用未检查的TrustStore。有人能就我的问题解释一下TrustStore的初始化例程吗?

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

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

证书不是保密的,但你不希望任何人篡改系统应该信任的证书列表(例如,提供一个流氓/虚假的根CA(。

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

是的,它会失败,如果你不提供密码,你就无法更新信任库

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

相关内容

最新更新