【发布时间】:2015-12-03 14:39:10
【问题描述】:
我有一个 mule 项目,它使用自签名证书通过 HTTPS (TLS) 与我的本地 tomcat 服务器进行出站连接。当我执行流程时,我得到以下异常
Mule HTTP 连接器
<http:request-config name="SP2" host="my_fqdn" port="38443" doc:name="SP Request Configuration" protocol="HTTPS" >
<tls:context>
<tls:trust-store path="/temp/temp1.keystore.jks" password="changeit" type="jks"/>
</tls:context>
</http:request-config>
Mule Flow 出错
javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
at sun.security.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:397) ~[?:1.7.0_67]
at org.mule.module.http.internal.domain.request.ClientConnection.getClientCertificate(ClientConnection.java:67) ~[mule-module-http-3.7.2.jar:3.7.2]
at org.mule.module.http.internal.listener.HttpRequestToMuleEvent.transform(HttpRequestToMuleEvent.java:63) ~[mule-module-http-3.7.2.jar:3.7.2]
at org.mule.module.http.internal.listener.DefaultHttpListener.createEvent(DefaultHttpListener.java:165) ~[mule-module-http-3.7.2.jar:3.7.2]
at org.mule.module.http.internal.listener.DefaultHttpListener.access$000(DefaultHttpListener.java:39) ~[mule-module-http-3.7.2.jar:3.7.2]
at org.mule.module.http.internal.listener.DefaultHttpListener$1.handleRequest(DefaultHttpListener.java:124) ~[mule-module-http-3.7.2.jar:3.7.2]
at org.mule.module.http.internal.listener.grizzly.GrizzlyRequestDispatcherFilter.handleRead(GrizzlyRequestDispatcherFilter.java:83) ~[mule-module-http-3.7.2.jar:3.7.2]
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) ~[grizzly-framework-2.3.21.jar:2.3.21]
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:283) ~[grizzly-framework-2.3.21.jar:2.3.21]
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200) ~[grizzly-framework-2.3.21.jar:2.3.21]
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132) ~[grizzly-framework-2.3.21.jar:2.3.21]
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111) ~[grizzly-framework-2.3.21.jar:2.3.21]
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) ~[grizzly-framework-2.3.21.jar:2.3.21]
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536) ~[grizzly-framework-2.3.21.jar:2.3.21]
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112) ~[grizzly-framework-2.3.21.jar:2.3.21]
at org.mule.module.http.internal.listener.grizzly.ExecutorPerServerAddressIOStrategy.run0(ExecutorPerServerAddressIOStrategy.java:102) ~[mule-module-http-3.7.2.jar:3.7.2]
at org.mule.module.http.internal.listener.grizzly.ExecutorPerServerAddressIOStrategy.access$100(ExecutorPerServerAddressIOStrategy.java:30) ~[mule-module-http-3.7.2.jar:3.7.2]
at org.mule.module.http.internal.listener.grizzly.ExecutorPerServerAddressIOStrategy$WorkerThreadRunnable.run(ExecutorPerServerAddressIOStrategy.java:125) ~[mule-module-http-3.7.2.jar:3.7.2]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [?:1.7.0_67]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [?:1.7.0_67]
at java.lang.Thread.run(Thread.java:745) [?:1.7.0_67]
通常这意味着我的信任存储设置不正确。就我而言,我在 Mule 的 TLS 上下文中设置了信任库。由于我仍然收到错误,我认为 Mule 不知何故不尊重我的 TLS 上下文设置。
此外,我在 Anypoint Studio 中设置了一个测试程序,该程序与执行 Mule 流程的项目相同。
System.setProperty("javax.net.ssl.trustStore","/temp/temp1.keystore.jks");
System.setProperty("javax.net.ssl.trustStoreType", KeyStore.getDefaultType());
System.setProperty("javax.net.ssl.trustStorePassword","changeit");
SocketFactory sslContext = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslSocket = (SSLSocket) sslContext.createSocket("my_fqdn",38443);
SSLSession sslSession = sslSocket.getSession();
sslSession.getPeerCertificates();
在上面提到的 Java 代码中,如果我没有正确设置信任库,我会收到“peer not authenticated”错误。但是,当我如上所述设置信任存储时,程序执行时不会出现任何错误。最后我尝试将信任库作为 JVM args 传递,但这也没有用。
所以我不知道为什么骡子会这样。有谁知道如何解决这个问题?
【问题讨论】:
-
你用的是什么mule版本?尝试将信任库文件添加为应用程序资源。
-
骡子 3.7.2。我也尝试将信任库保留在项目中,但这没有帮助。
-
您显示的堆栈跟踪将错误放在
http-listener上,但配置适用于http-request。侦听器配置是什么样的? -
我也有传入的 HTTP 监听器。这是侦听器配置
<http:listener-config name="HTTP_Listener_Configuration" protocol="HTTPS" host="my_fqdn" port="28443" doc:name="HTTP Listener Configuration"> <tls:context> <tls:key-store type="jks" path="/temp/temp1.keystore.jks" password="changeit" keyPassword="changeit"/> </tls:context> </http:listener-config>当我使用 HTTPS 侦听器和 HTTP 作为传出时,我的设置有效。当我使用 HTTPS 侦听器和 HTTPS 作为传出设备时,我开始收到上述错误。 -
在进一步调试中,我发现我报告的原始堆栈跟踪实际上只是来自HTTP侦听器的调试警告,而不是问题的根本原因。根错误消息是 java.util.concurrent.ExecutionException: java.io.IOException: Remotely closed 我在网上找到了link,但不知道如何解决问题。