【问题标题】:Mule ESB does not accept SSL cert when deployed on server, but works fine on local dev machineMule ESB 在服务器上部署时不接受 SSL 证书,但在本地开发机器上工作正常
【发布时间】:2014-10-09 11:40:08
【问题描述】:

我已将 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 配置差异可能导致这种情况?

【问题讨论】:

  • @jww 当然,这是一个类似的问题,但该问题专门涉及在代码中设置信任库。对于使用 Mule 的人(主要是 XML 配置),我认为只有获得 Mule 源并开始使用自定义构建修改默认行为时才会有用。

标签: java ssl https mule


【解决方案1】:

事实证明,Mule 并没有为每个服务使用不同的信任库。如果您部署了多个服务,最后一个显式声明信任存储的服务将强制所有其他服务使用相同的信任存储,覆盖它们可能拥有的任何配置。这发生在我的案例中。我通过回显 System.getProperty("javax.net.ssl.trustStore"); 发现了这一点。记录并意识到它是一个信任库,它是一些完全不同的已部署项目中的资源,但被我使用。 似乎骡子们搞砸了。

【讨论】:

  • 独立于 Mule 团队所做的事情,System.getProperty("javax.net.ssl.trustStore") 只被读取一次以初始化默认的SSLContext。在默认 SSLContext 初始化后更改它(即第一次使用 SSL/TLS 时没有以编程方式加载特定的 SSLContext)将无效。因此,回显System.getProperty("javax.net.ssl.trustStore") 不一定反映正在使用的内容。
  • @Bruno 够公平的。我很幸运,该物业为我指明了正确的方向。我不确定为什么 Mule 设置默认上下文而不是为每个服务使用唯一的上下文。看看 JIRA,我发现了一个似乎是这个确切问题的旧错误,几年前已修复,但看起来它已经退化了。
【解决方案2】:

我同意您的怀疑,即您的 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 信任的证书。

【讨论】:

  • 感谢您的提示。到目前为止,我只是在做 XML 并使用 OOTB 连接器,但我可能必须更改一些 java 代码才能解决这个问题。我真正的问题是找出问题发生的原因,不仅适用于 SalesForce 连接器,还适用于标准 HTTPS 连接器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
  • 2018-03-07
  • 2018-10-22
  • 2013-05-21
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
相关资源
最近更新 更多