如何以编程方式在磁盘上查找当前信任库?

时间:2012-12-01 07:13:30

标签: java ssl truststore

是否有任何函数告诉我在我的程序中使用的当前信任库是什么。在Windows上,默认信任库位于JAVA_HOME \ lib \ security \ cacerts。

但是,可以通过多种方式更改默认值。

  • 在命令行中使用-Djavax.net.ssl.keyStore

  • 使用Keystore类。

  • 如果程序在运行应用程序的App Server上运行,则可以通过它的面板设置商店路径。

  • 如果程序在Tomcat上运行,则Tomcat设置可能会更改信任库。

以及许多其他方式。

是否有一种编程方式可以找出当前处于活动状态的信任库的磁盘路径?

1 个答案:

答案 0 :(得分:11)

一般来说,你不能(这与this question非常相似)。

在JSSE API中,信任证书实际上并不是由信任库确定的,而是由TrustManager确定的。虽然它通常使用密钥库(信任库)初始化,但这不是必需的。另外,keystores themselves don't have to be files。默认信任管理器API中没有任何内容可以让您检查潜在信任存储的使用位置和方式。

SSLSocket中甚至没有任何内容可以让您回到SSLSocketFactory,并且没有任何内容可以让您回到原始SSLContext,而且那里没有任何内容让你获得信任经理。

哪个信任库/信任管理器当前处于活动状态也很大程度上取决于应用程序。一般来说,没有什么能告诉您应用程序正在使用的连接是使用默认的SSLContext,它可以由javax.net.ssl.*系统属性初始化。应用程序可以自由地初始化它们自己的SSLContext以创建它们的套接字(这是Tomcat在指定某些值时为其连接器所做的事情)。

从Java 6开始,默认(当前)SSLContext也可以全局更改(通过SSLContext.setDefault(...)

您可以从JSSE Reference Guide找到默认使用的内容。其余的将取决于每个应用程序的文档。如果需要,使用-Djavax.net.debug=SSL,trustmanager可能有所帮助,但这不是API访问。

(顺便说一下,-Djavax.net.ssl.keyStore将为默认密钥管理器设置密钥库,而不是信任存储。)