如何向“java.net.ssl.trustStore”添加多个信任库路径?

2023-12-24

我希望我的 Java 代码在一个密钥库中搜索服务器的 CA 证书...如果它无法找到特定的证书(我认为只有当我尝试通过 LDAP 连接到目录服务器时才会知道),它应该在另一个密钥库中查找证书,我知道其路径。

我试过这个:

System.setProperty("javax.net.ssl.trustStore", System.getProperty("java.home") + "/lib/security/cacerts" + System.getProperty("path.separator") + path/to/second/keystore);

但这似乎不起作用。

仅添加一个路径(其中任何一个)都有效,即如果找到证书,它就会像魅力一样运行,如果没有找到证书,它就会失败。

所以我的问题是:

  1. 有没有一种方法可以将多个密钥库路径添加到 javax.net.ssl.trustStore ?

  2. 如果不可能,我应该如何编写我的代码(我要求算法),以便它在第一次搜索本身后不会抛出异常并失败?

附: : 我对Java不太熟悉。

以下是我的代码的相关部分:

if(useSSL)
{
  try 
  {   
    SSLContext se = SSLContext.getInstance("TLS");
    Security.addProvider(se.getProvider());
  }   
  catch(NoSuchAlgorithmException e) { }

  System.setProperty("javax.net.ssl.trustStore", System.getProperty("java.home") + "/lib/security/cacerts");

  com.org.ldap.LDAPSocketFactory ssf = new LDAPJSSESecureSocketFactory();
  LDAPConnection.setSocketFactory(ssf);
}

try 
{   
  lc = new LDAPConnection();
  lc.connect( ldapServer, ldapPort);
  lc.bind( ldapVersion,  ldapUser, (userInfo[1]).getBytes() );
}
catch (LDAPException le)
{
  le.printStackTrace();
}

您不能有多个路径javax.net.ssl.trustStore.

最简单的方法是制作 JRE 的本地副本cacerts并将证书从其他商店导入到其中(有效地合并它们)。 (看keytool -importkeystore.)

否则,如果您事先知道所有 LDAP 连接都将使用您的第二个密钥库(并且您还希望能够将默认信任库用于其他不相关的连接),则可以为此配置该信任库SSLSocketFactory仅有的。我不熟悉com.org.ldap.LDAPSocketFactory,但它可能可以选择这样做。 (否则,您可以创建您的自定义SSLContext使用您的第二个信任库进行初始化并获得SSLSocketFactory,如中所述这个答案 https://stackoverflow.com/a/859271/372643).

另一种更复杂的方法是创建自定义X509TrustManager它包装默认的信任管理器,捕获其异常,然后使用第二个存储初始化的另一个信任管理器再次尝试。这是可行的,但您需要确保如果两个信任管理器都不接受您的证书,它仍然会抛出异常(否则,将会存在安全漏洞)。如果您不熟悉 JSSE API(或整个 Java),那么它可能不是最佳选择。

另外,使用时要小心System.setProperty("javax.net.ssl.trustStore", ...)在您的代码中:这是初始化默认值时读取的内容SSLContext,但是默认的SSLContext仅在第一次需要时初始化一次。之后设置此系统属性将不会产生任何效果(当然,除非其他库中的其他类也依赖于此值)。


也不清楚您想通过此实现什么目的,因为您总是会成功添加已经存在的安全提供程序:

  try 
  {   
    SSLContext se = SSLContext.getInstance("TLS");
    Security.addProvider(se.getProvider());
  }   
  catch(NoSuchAlgorithmException e) { }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何向“java.net.ssl.trustStore”添加多个信任库路径? 的相关文章

随机推荐