我有一个非常简单的场景:
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存储。
证书不是保密的,但您不希望任何人篡改系统应信任的证书列表(例如,提供恶意/伪造的根CA)。
[应该有一种方法来强制信任库的信任(密码应该是已验证)。如果输入错误的密码,密码会失败吗?
是的,它将失败,并且如果您不提供密码,则无法更新信任库
实际上,这是预期的行为。对于JKS密钥库,您可以列出条目和证书而没有任何密码,但是无法验证完整性。无论如何,您应该在应用程序中提供密码,以确保没有人通过信任库使用sc..wd。