使用CXF服务时重置连接(ssl .net)

时间:2015-08-21 10:11:26

标签: java web-services ssl cxf asmx

我正在与这个问题作斗争,到目前为止,Stackoveflow和Google让我失望了。 我在Spring中使用ssl .NET服务,但我得到了:

org.apache.cxf.interceptor.Fault: Could not send Message.
(...)
Caused by: java.net.SocketException: SocketException invoking https://address/service/servicews.asmx: Connection reset

我的配置如下:

<jaxws:client
        id="service"
        serviceClass="com.(...).service.SomenameSoap"
        address="${environment.facade.xxx.service.address}">

    <jaxws:outInterceptors>
        <bean class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
            <constructor-arg>
                <map>
                    <entry key="action" value="UsernameToken Timestamp"/>
                    <entry key="user" value="${environment.facade.xxx.service.auth.header.user}"/>
                    <entry key="passwordType" value="PasswordText"/>
                    <entry key="addUTElements" value="Nonce Created"/>
                    <entry key="passwordCallbackRef" value-ref="securityCallbackHandler"/>
                </map>
            </constructor-arg>
        </bean>
    </jaxws:outInterceptors>

    <jaxws:features>
        <bean class="org.apache.cxf.feature.LoggingFeature"/>
    </jaxws:features>
</jaxws:client>

<http:conduit name="{http://tempuri.org/}servicePortNamePort.http-conduit">
    <http:tlsClientParameters disableCNCheck="${environment.facade.xxx.service.disableCNCheck}">
        <sec:trustManagers>
            <sec:keyStore type="JKS" password="xxx" resource="/certificates/truststore.jks"/>
        </sec:trustManagers>
        <sec:cipherSuitesFilter>
            <sec:include>.*_EXPORT_.*</sec:include>
            <sec:include>.*_EXPORT1024_.*</sec:include>
            <sec:include>.*_WITH_DES_.*</sec:include>
            <sec:include>.*_WITH_NULL_.*</sec:include>
            <sec:exclude>.*_DH_anon_.*</sec:exclude>
        </sec:cipherSuitesFilter>
    </http:tlsClientParameters>
</http:conduit>

当我运行Spring测试时,我得到以下异常:

2015-08-21 11:54:53,491 WARN [main] [org.apache.cxf.phase.PhaseInterceptorChain:443] - <Interceptor for {http://tempuri.org/}SomeserviceSoapService#{http://tempuri.org/}Method has thrown exception, unwinding now>
org.apache.cxf.interceptor.Fault: Could not send Message.
    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:64)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
    at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:570)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:479)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:382)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:335)
    at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:137)
    at com.sun.proxy.$Proxy56.validateXXX(Unknown Source)
    at com.(...).Facade.createXXX(XXX.java:31)
    at com.(...).FacadeTest.testCreateXXX(FacadeTest.java:21)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:74)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:211)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Caused by: java.net.SocketException: SocketException invoking https://address/service/servicews.asmx: Connection reset
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:1474)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1459)
    at org.apache.cxf.io.CacheAndWriteOutputStream.postClose(CacheAndWriteOutputStream.java:56)
    at org.apache.cxf.io.CachedOutputStream.close(CachedOutputStream.java:229)
    at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
    at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:660)
    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
    ... 41 more
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:196)
    at java.net.SocketInputStream.read(SocketInputStream.java:122)
    at sun.security.ssl.InputRecord.readFully(InputRecord.java:442)
    at sun.security.ssl.InputRecord.read(InputRecord.java:480)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:927)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
    at sun.net.www.protocol

我正在运行CXF 2.6.16并且代码正在使用java 1.5进行编译。 我已经阅读了关于分块问题并添加到我的管道配置中,它导致另一个例外:

2015-08-21 12:07:45,900 WARN [main] [org.apache.cxf.phase.PhaseInterceptorChain:443] - <Interceptor for {http://tempuri.org/}SomeserviceSoapService#{http://tempuri.org/}Method has thrown exception, unwinding now>
org.apache.cxf.binding.soap.SoapFault: Problem writing SAAJ model to stream: Connection reset
Caused by: com.ctc.wstx.exc.WstxIOException: Connection reset
Caused by: java.net.SocketException: Connection reset

我可以使用相同的信任库和信用卡在Soap UI中使用此服务。 帮助我Stackoverflow你是我唯一的帮助。

1 个答案:

答案 0 :(得分:0)

tlsClientParameters中,包含元素secureSocketProtocol,其值为&#34; TLS&#34; (见CXF TLS Configuration)。

此外,为了消除密码套件可用性是一个问题,请尝试将所有密码套件与此单独的通配符包含过滤器包括在一起:

<sec:include>.*</sec:include>

如果仍在重置连接,请启用以下系统属性:

System.setProperty("javax.net.debug", "all");

检查标准输出并在连接重置之前立即发布从服务器收到的内容。

唉,很可能这样一个旧的Java运行时可能不支持服务器允许的SSL / TLS协议和密码套件。