Mule ESB在服务器上部署时不接受SSL证书,但在本地开发计算机上运行正常

时间:2014-08-15 17:47:03

标签: java ssl https mule

我将Mule ESB部署到Linux服务器和在我的本地Windows开发环境中运行的Anypoint Studio。我有一个相当简单的流程,包括SalesForce连接器。 Salesforce REST API有一个由VeriSign签名的有效证书,我的本地Mule实例很乐意接受它并连接没有任何问题。但是,当Mule在服务器上运行时,它总是抛出" PKIX路径构建失败,无法找到所请求目标的有效证书路径"。

我尝试使用默认的java密钥库,使用javax.net.ssl.keystore指定密钥库,没有任何作用。

在我的本地计算机上,我最终做了以下操作,以表明Mule正在使用正确的信任存储:

我生成了一个空的信任库,并将其作为资源添加到我的AnyPoint项目中。我创建了一个HTTPS连接器配置,以便显式指定我想要用于SalesForce连接器的信任库,并将其指向我的空信任库。当我尝试在本地运行项目时,我得到完全相同的SSL错误(正如我所料,因为它是一个空的信任库)。然后我获取VeriSign CA证书并将其添加到我的空信任库。在那之后,本地一切都很好。对我而言,这证实了我的mule项目正在使用我作为项目本身资源添加的信任库。 然后我导出该项目并将其部署到我的服务器。在服务器上它会抛出SSL错误。

可能会出现一些奇怪的JVM配置差异吗?

2 个答案:

答案 0 :(得分:3)

事实证明,Mule不为每个服务使用不同的信任存储。如果您部署了多个服务,则显式声明信任存储的最后一个服务将强制所有其他服务使用同一个信任存储,覆盖它们可能具有的任何配置。在我的情况下发生了这种情况。我通过回显System.getProperty(“javax.net.ssl.trustStore”)找到了这个。记录并意识到它是一个信任存储,它是一个完全不同的部署项目中的资源,但被我的使用。 看起来骡子家伙搞得很糟糕。

答案 1 :(得分:0)

我同意您的怀疑,即您的Linux服务器上的JDK不信任正确的证书。但是,这不需要阻止您的应用程序这样做。

通过执行以下操作,我已经能够使salesforce连接器信任给定的证书:

KeyStore truststore = KeyStore.getInstance("JKS");
truststore.load(myKeystoreInputStream, myKeystorePassword.toCharArray());

TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(truststore);

SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, tmf.getTrustManagers(), null);
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());

关键是最后一行。 salesforce连接器直接使用HttpsURLConnection连接到服务器,而HTTPS连接器则不使用。这将允许您的mule应用程序为salesforce使用不同于一个或多个HTTPS连接器的信任存储。您可以使用它来控制应用程序将信任的SSL证书,而不依赖于服务器的JVM信任的证书。