[
https://issues.apache.org/jira/browse/WSS-702?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17766250#comment-17766250
]
Cedric Tabin commented on WSS-702:
----------------------------------
Hi [~dkulp],
I just tried with the CXF version 4.0.3 just published this morning and it
seems to solve the problem. Now it directly crashes with UnknownHostException,
which is expected.
Hence, I guess this ticket can be closed.
> Process hangs when a signature is added and server not reachable
> ----------------------------------------------------------------
>
> Key: WSS-702
> URL: https://issues.apache.org/jira/browse/WSS-702
> Project: WSS4J
> Issue Type: Bug
> Affects Versions: 3.0.1
> Environment: Linux Debian
> JDK 17
> Apache CXF 4.0.2
> WSS4j 3.0.1 (and also 3.0.0)
> Reporter: Cedric Tabin
> Assignee: Colm O hEigeartaigh
> Priority: Major
> Attachments: sample.zip
>
>
> Hello,
> We are using wss4j with the Apache CXF library to connect to a SOAP web
> service. The latter has some security-enabled methods which involves
> signature and encryption.
> When writing the unit tests related to this, we hit a strange problem: if the
> signature is enabled (through `WSS4JOutInterceptor`), then the process hangs
> indefinitely during marshalling without any exception regardless of any
> timeout set in the configuration (although a "Connection refused" exception
> should have been thrown right away since we are pointing to localhost:1234
> but this is the case for any host).
> The main problem is if there is any connection issue on the client side and
> the server is unreachable, the process will wait forever.
> Here is the code snipped involved:
> {code:java}
> final ClientImpl client = (ClientImpl) ClientProxy.getClient(port);
> //url points to localhost:1234 on which nothing is listening => connection
> should be refused immediately
> client.getRequestContext().put(Message.ENDPOINT_ADDRESS, url);
> client.setThreadLocalRequestContext(true);
> client.setSynchronousTimeout(10000);
> final HTTPConduit httpConduit = (HTTPConduit) client.getConduit();
> HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
> httpClientPolicy.setReceiveTimeout(1200000);
> httpClientPolicy.setAllowChunking(true);
> httpClientPolicy.setMaxRetransmits(0);
> httpConduit.setClient(httpClientPolicy);
> TLSClientParameters tlsClientParameters = new TLSClientParameters();
> tlsClientParameters.setSecureSocketProtocol("TLSv1.3");
> tlsClientParameters.setDisableCNCheck(true);
> httpConduit.setTlsClientParameters(tlsClientParameters);
> {
> WSEncryptionPart sigTimestamp = new WSEncryptionPart("Timestamp",
> WSConstants.WSU_NS, "");
> WSEncryptionPart sigBody = new WSEncryptionPart("Body",
> WSConstants.URI_SOAP11_ENV, "");
> SignatureActionToken erpSignature = new SignatureActionToken();
> erpSignature.setUser(getSignatureUser());
> erpSignature.setCryptoProperties(getOutSecurityPropFile());
> erpSignature.setKeyIdentifierId(WSConstants.BST_DIRECT_REFERENCE);
> erpSignature.setSignatureAlgorithm(WSConstants.RSA_SHA256);
> erpSignature.setDigestAlgorithm(WSConstants.SHA256);
> erpSignature.setParts(Arrays.asList(sigTimestamp, sigBody));
> List<HandlerAction> actions = new ArrayList<>();
> actions.add(new HandlerAction(WSConstants.TS, null));
> actions.add(new HandlerAction(WSConstants.SIGN, erpSignature));
> Map<String, Object> properties = getOutSecurityProperties();
> properties.put(WSHandlerConstants.HANDLER_ACTIONS, actions);
> ExtensibleWSS4JOutInterceptor wss4JOutInterceptor = new
> ExtensibleWSS4JOutInterceptor(properties, getAfterSignatureCallbacks());
> wss4JOutInterceptor.setId("WSS4JOutSignatureInterceptor");
> //if this line is commented => the process fails directly (which is
> correct) because nothing is listening at the endpoint
> client.getOutInterceptors().add(wss4JOutInterceptor);
> }
> String operation = jaxbElement.getName().getLocalPart();
> Object[] object = client.invoke(operation, jaxbElement.getValue());
> return object[0];
> {code}
> If the `wss4JOutInterceptor` is not added, the the process immediately fails
> (which is expected).
> {noformat}
> org.apache.cxf.interceptor.Fault: Could not send Message.
> at
> org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:67)
> at
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:528)
> at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:439)
> at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:354)
> at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:312)
> at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:332)
> at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:318)
> Caused by: java.net.ConnectException: ConnectException invoking
> [https://localhost:1234/Invalid:] Connection refused
> at
> java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native
> Method)
> at
> java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
> at
> java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
> at
> java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
> at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
> Caused by: java.net.ConnectException
> at
> java.net.http/jdk.internal.net.http.common.Utils.toConnectException(Utils.java:1055)
> at
> java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:198)
> at
> java.net.http/jdk.internal.net.http.PlainHttpConnection.checkRetryConnect(PlainHttpConnection.java:230)
> at
> java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$1(PlainHttpConnection.java:206)
> at
> java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:934)
> at
> java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:911)
> at
> java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
> at
> java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1773)
> at
> java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
> at
> java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
> at java.base/java.lang.Thread.run(Thread.java:833)
> Caused by: java.nio.channels.ClosedChannelException
> at
> java.base/sun.nio.ch.SocketChannelImpl.ensureOpen(SocketChannelImpl.java:195)
> at
> java.base/sun.nio.ch.SocketChannelImpl.beginConnect(SocketChannelImpl.java:760)
> at java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:848)
> at
> java.net.http/jdk.internal.net.http.PlainHttpConnection.lambda$connectAsync$0(PlainHttpConnection.java:183)
> at
> java.base/java.security.AccessController.doPrivileged(AccessController.java:569)
> at
> java.net.http/jdk.internal.net.http.PlainHttpConnection.connectAsync(PlainHttpConnection.java:185)
> {noformat}
> If any help, here is the stacktrace where the process hangs forever:
> {noformat}
> at java.lang.Object.wait(Object.java)
> at java.io.PipedInputStream.awaitSpace(PipedInputStream.java:273)
> at java.io.PipedInputStream.receive(PipedInputStream.java:231)
> at java.io.PipedOutputStream.write(PipedOutputStream.java:150)
> at
> org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:51)
> at
> org.apache.cxf.io.AbstractThresholdOutputStream.write(AbstractThresholdOutputStream.java:69)
> at
> org.glassfish.jaxb.runtime.v2.runtime.output.UTF8XmlOutput.write(UTF8XmlOutput.java:386)
> at
> org.glassfish.jaxb.runtime.v2.runtime.output.Encoded.write(Encoded.java:137)
> at
> org.glassfish.jaxb.runtime.v2.runtime.output.UTF8XmlOutput.writePrefix(UTF8XmlOutput.java:205)
> at
> org.glassfish.jaxb.runtime.v2.runtime.output.UTF8XmlOutput.writeName(UTF8XmlOutput.java:209)
> at
> org.glassfish.jaxb.runtime.v2.runtime.output.UTF8XmlOutput.beginStartTag(UTF8XmlOutput.java:138)
> at
> org.glassfish.jaxb.runtime.v2.runtime.output.ForkXmlOutput.beginStartTag(ForkXmlOutput.java:48)
> at
> org.glassfish.jaxb.runtime.v2.runtime.XMLSerializer.leafElement(XMLSerializer.java:288)
> at
> org.glassfish.jaxb.runtime.v2.model.impl.RuntimeBuiltinLeafInfoImpl$StringImplImpl.writeLeafElement(RuntimeBuiltinLeafInfoImpl.java:1115)
> at
> org.glassfish.jaxb.runtime.v2.model.impl.RuntimeBuiltinLeafInfoImpl$StringImplImpl.writeLeafElement(RuntimeBuiltinLeafInfoImpl.java:1092)
> at
> org.glassfish.jaxb.runtime.v2.runtime.reflect.TransducedAccessor$CompositeTransducedAccessorImpl.writeLeafElement(TransducedAccessor.java:224)
> at
> org.glassfish.jaxb.runtime.v2.runtime.property.SingleElementLeafProperty.serializeBody(SingleElementLeafProperty.java:94)
> at
> org.glassfish.jaxb.runtime.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:334)
> at
> org.glassfish.jaxb.runtime.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:659)
> at
> org.glassfish.jaxb.runtime.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:128)
> at
> org.glassfish.jaxb.runtime.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:334)
> at
> org.glassfish.jaxb.runtime.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:659)
> at
> org.glassfish.jaxb.runtime.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:128)
> at
> org.glassfish.jaxb.runtime.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:334)
> at
> org.glassfish.jaxb.runtime.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:659)
> at
> org.glassfish.jaxb.runtime.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:38)
> at
> org.glassfish.jaxb.runtime.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:132)
> at
> org.glassfish.jaxb.runtime.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:122)
> at
> org.glassfish.jaxb.runtime.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:334)
> at
> org.glassfish.jaxb.runtime.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:659)
> at
> org.glassfish.jaxb.runtime.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:128)
> at
> org.glassfish.jaxb.runtime.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:334)
> at
> org.glassfish.jaxb.runtime.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:659)
> at
> org.glassfish.jaxb.runtime.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:128)
> at
> org.glassfish.jaxb.runtime.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:334)
> at
> org.glassfish.jaxb.runtime.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:659)
> at
> org.glassfish.jaxb.runtime.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:128)
> at
> org.glassfish.jaxb.runtime.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:334)
> at
> org.glassfish.jaxb.runtime.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:659)
> at
> org.glassfish.jaxb.runtime.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:128)
> at
> org.glassfish.jaxb.runtime.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:125)
> at
> org.glassfish.jaxb.runtime.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:93)
> at
> org.glassfish.jaxb.runtime.v2.runtime.ElementBeanInfoImpl.serializeBody(ElementBeanInfoImpl.java:316)
> at
> org.glassfish.jaxb.runtime.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:324)
> at
> org.glassfish.jaxb.runtime.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:38)
> at
> org.glassfish.jaxb.runtime.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:456)
> at
> org.glassfish.jaxb.runtime.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:265)
> at
> org.glassfish.jaxb.runtime.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:197)
> at
> jakarta.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:86)
> at
> org.apache.cxf.jaxb.JAXBEncoderDecoder.writeObject(JAXBEncoderDecoder.java:642)
> at
> org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:244)
> at org.apache.cxf.jaxb.io.DataWriterImpl.write(DataWriterImpl.java:238)
> at
> org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor.writeParts(AbstractOutDatabindingInterceptor.java:118)
> at
> org.apache.cxf.wsdl.interceptors.BareOutInterceptor.handleMessage(BareOutInterceptor.java:68)
> at
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
> at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:528)
> at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:439)
> at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:354)
> at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:312)
> at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:332)
> at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:318)
> {noformat}
> Any workaround is welcome.
> Thanks & best regards.
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]