如何在通过 JNDI 命名服务器连接时为 Hornetq 客户端指定本地自定义 SSL 信任库

How to specify a local custom SSL truststore for Hornetq client when connecting via JNDI naming server

我们有一个 java 客户端(mule 应用程序),它使用 hornetq 客户端 (v2.3.25.SP20) 通过 JNDI 命名服务器(端口 1099)连接到 HornetQ 远程服务器。 使用 SSL 保护连接。驱动程序要求明确设置 javax.net.ssl.trustStore 属性。否则,它找不到信任库。

我们想为会话指定一个自定义信任库。 但是设置一个全局的 属性 javax.net.ssl.trustStore 可能会影响其他应用程序。所以,我们正在寻找替代方案。

我编写了指向自定义信任库的自定义信任管理器 (X509TrustManager)。但问题是它仅用于建立与 JNDI 服务器的连接。然后,实际的连接对象从远程服务器获取信任库位置(当然,如果 javax.net.ssl.trustStore 未设置)。
产生错误HQ212007:

connector.create or connectorFactory.createConnector should never throw an exception, implementation is badly behaved, but we will deal with it anyway.

Unable to create NettyConnector for myserver:4447
Failed to find a store at remote server keystore location

谷歌搜索错误代码,我发现描述的问题非常相似,但未提供解决方案 here

那么,在通过 JNDI 连接时,是否有另一种方法可以为 hornetq 客户端指定信任库的路径,这样它就不会影响同一 VM 系统上的其他应用程序 运行?或者,可能有一种方法可以完全禁用客户端的 SSL 证书验证——这对我们也有用吗?

有特定于 HornetQ 的系统属性来设置 SSL 配置参数。查看 the documentation for HornetQ 2.4.0

这些属性是在 2.3.0.Final 之后添加的,但向后移植到 2.3.x 分支,这就是为什么它们在 2.3.25.SP20 中可用但未记录在 2.3 中的原因.0.Final 文档。

简而言之,您可以使用这些系统属性而不是全局属性:

  • org.hornetq.ssl.keyStore
  • org.hornetq.ssl.keyStorePassword
  • org.hornetq.ssl.trustStore
  • org.hornetq.ssl.trustStorePassword