【问题标题】:Mule HTTPS connector that trusts all certificates信任所有证书的 Mule HTTPS 连接器
【发布时间】:2015-01-31 00:43:04
【问题描述】:

我正在为 Mule ESB 应用程序编写集成测试。 Mule 应用程序通过 HTTPS 连接到第三方 API。当我尝试针对第三方测试 API 端点运行我的应用程序时,一切正常,我不必向 HTTPS 连接器添加任何 client 特定的 SSL 配置。我相信这是因为他们的服务器具有 CA 签名证书,因此他们立即受到信任,例如像这样的 HTTP 连接器

<https:connector
        name="my.https.connector"
        cookieSpec="netscape"
        validateConnections="true"
        sendBufferSize="0"
        receiveBufferSize="0"
        receiveBacklog="0"
        clientSoTimeout="10000"
        serverSoTimeout="10000"
        socketSoLinger="0"
        doc:name="HTTPS">
    <service-overrides sessionHandler="org.mule.session.NullSessionHandler"/>
</https:connector>

开箱即用。

在编写集成测试时,我对第三方 API 进行存根(或模拟,如果您愿意的话)。但是,为了使 SSL 工作,我必须为嵌入式 HTTPS 服务器生成一个密钥库,并通过添加修改客户端 HTTPS 连接器

    <https:tls-client path="keystore" storePassword="psw" />
    <https:tls-key-store path="keystore" storePassword="psw" keyPassword="psw" />

正如互联网上提到的那样。

我可以在一个单独的 XML 文件中定义测试 HTTPS 连接器,并在 FunctionalTestCase.getConfigResources() 方法中加载它。然而这并不理想:我真正追求的是一种使 HTTPS 连接器(客户端)信任 一切 - 但仅在运行集成测试时 - 即在执行 Maven 构建。这必须以编程方式进行,以使 Mule 应用程序代码保持不变。

我尝试将以下代码添加到 @BeforeClass 带注释的方法中

http://www.rgagnon.com/javadetails/java-fix-certificate-problem-in-HTTPS.html

但没有运气。运行集成测试时,我仍然遇到以下异常

Exception stack is:
1. unable to find valid certification path to requested target (sun.security.provider.certpath.SunCertPathBuilderException)
  sun.security.provider.certpath.SunCertPathBuilder:196 (null)
2. PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target (sun.security.validator.ValidatorException)
  sun.security.validator.PKIXValidator:385 (null)
3. sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target (javax.net.ssl.SSLHandshakeException)
  sun.security.ssl.Alerts:192 (http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/net/ssl/SSLHandshakeException.html)

有工作解决方案的人吗? :)

【问题讨论】:

    标签: java ssl https mule


    【解决方案1】:

    在运行时管理器的属性中设置:com.ning.http.client.AsyncHttpClientConfig.acceptAnyCertificate=true

    根据需要配置您的 pom.xml 文件,使其在部署之间保持一致。

    【讨论】:

      【解决方案2】:

      您不能只创建一个测试 jks 文件以导入 ESB 生态系统进行测试,有什么特别的原因吗?我假设 ESB 有一个测试环境,您可以在其中运行测试用例。

      【讨论】:

      • 不,抱歉,事实并非如此。对于我的集成测试,我正在运行一个完全嵌入式的环境,该环境在 Maven 构建期间以编程方式启动/关闭。这就是使用 Mule Test Compatibility Kit ( TCK ) 的全部意义所在,这也是 HTTPS 的问题所在。
      • 因此,通常在这些场景中,您有一个嵌入式环境,其中测试框架(在本例中为 Mule)会启动/关闭 Web 容器,您通常可以包含 Mule 应该能够执行的安全设置在启动时注入容器。所以事件的顺序应该如下所示: 1. 将 jks 文件复制到目录 2. 将安全配置部署到 Web 容器中 3. 部署应用程序 4. 运行测试 5. 关闭
      • 好的,我想我现在明白这个问题了。您有一个模拟服务,其中没有正确的 CA 链,因此您收到 SSL 错误。客户端测试是遇到问题的人。当您运行客户端测试时,您希望客户端仅在测试期间忽略 SSL 错误。在这种情况下,我会说您使用 java 参数来执行测试本身: java -Djavax.net.ssl.keyStore=serverKeys -Djavax.net.ssl.keyStorePassword=password -Djavax.net.ssl.trustStore= serverTrust -Djavax.net.ssl.trustStorePassword=password SSLApplication
      • 感谢您的意见。不幸的是,这不是一个适用于Mule Test Compatibility Kit ( TCK ) 的解决方案。或者至少我无法让它发挥作用。
      • 没问题,我的感觉是,如果没有来自 maven 的一些文件插入/jvm 参数控制,您的问题(这是常见的 btw 并通过说 jenkins 中的客户端启动参数解决)将无法解决。本例中的服务器很好。
      猜你喜欢
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      • 2022-10-19
      • 1970-01-01
      • 2017-05-06
      • 2010-11-15
      • 1970-01-01
      相关资源
      最近更新 更多