I have a client to a SOAP service I do not control (implemented in .NET). The service provides a WSDL. I use JAX-WS's toolset to generate the java client from the WSDL (specifically, the jaxws-maven-plugin for Maven, which uses wsimport under the hood).
The response below is received.
2024-03-02 16:59:21.141 ERROR 20616 --- [nio-9091-exec-3] c.e.n.client.controller.RestController : org.springframework.ws.soap.client.SoapFaultClientException: The security context token is expired or is not valid. The message was not processed. at org.springframework.ws.soap.client.core.SoapFaultMessageResolver.resolveFault(SoapFaultMessageResolver.java:38) at org.springframework.ws.client.core.WebServiceTemplate.handleFault(WebServiceTemplate.java:787) at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:601) at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:538) at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:390) at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:384) at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:374)
i have setup an interceptor (code below), ensured that the keystore has the certificates from service provide and a self-signed certificate from dev environments.
@Autowired
public WebServiceSecurityInterceptor(
KeyStoreCallbackHandler securityCallbackHandler,
CryptoFactoryBean cryptoFactory
) throws Exception {
super();
setValidationActions(
WSHandlerConstants.TIMESTAMP
+ " "
+ WSHandlerConstants.SIGNATURE
+ " " + WSHandlerConstants.ENCRYPT);
setValidationSignatureCrypto(cryptoFactory.getObject());
setValidationDecryptionCrypto(cryptoFactory.getObject());
setValidationCallbackHandler(securityCallbackHandler);
// set security actions
setSecurementActions(
WSHandlerConstants.TIMESTAMP + " " +
WSHandlerConstants.SIGNATURE + " " +
WSHandlerConstants.ENCRYPT);
// sign the request
setSecurementUsername(SIGNING_USERNAME);
setSecurementPassword(PASSWORD);
setSecurementSignatureCrypto(cryptoFactory.getObject());
setSecurementSignatureAlgorithm(WSS4JConstants.RSA);
// encrypt the request
setSecurementEncryptionUser(ENCRYPTION_USER);
setSecurementEncryptionCrypto(cryptoFactory.getObject());
setSecurementEncryptionParts("{Content}{}Body");
setSecurementSignatureKeyIdentifier("IssuerSerial");
setSecurementEncryptionKeyTransportAlgorithm(WSS4JConstants.KEYTRANSPORT_RSA15);
setSecurementEncryptionSymAlgorithm(WSS4JConstants.TRIPLE_DES);
}