diff --git a/spring-boot/spring-boot-rest/pom.xml b/spring-boot/spring-boot-rest/pom.xml
index 90451cfe..f701ecf7 100644
--- a/spring-boot/spring-boot-rest/pom.xml
+++ b/spring-boot/spring-boot-rest/pom.xml
@@ -94,7 +94,7 @@
target/generated-sources/cxf
- ${basedir}/src/main/resources/NAWebServiceSoapHttpPort.wsdl
+ ${project.basedir}/src/main/resources/NAWebServiceSoapHttpPort.wsdl
@@ -109,7 +109,7 @@
target/generated-sources/cxf
- ${basedir}/src/main/resources/UtlevererWebServiceSoapHttpPort.wsdl
+ ${project.basedir}/src/main/resources/UtlevererWebServiceSoapHttpPort.wsdl
@@ -124,7 +124,7 @@
target/generated-sources/cxf
- ${basedir}/src/main/resources/RekvirentWebServiceSoapHttpPort.wsdl
+ ${project.basedir}/src/main/resources/RekvirentWebServiceSoapHttpPort.wsdl
diff --git a/spring-boot/spring-boot-rest/src/test/resources/bindings/bindings.xjb b/spring-boot/spring-boot-rest/src/test/resources/bindings/bindings.xjb
deleted file mode 100644
index 33134e54..00000000
--- a/spring-boot/spring-boot-rest/src/test/resources/bindings/bindings.xjb
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/spring-boot/spring-boot-soap/pom.xml b/spring-boot/spring-boot-soap/pom.xml
index af7830cd..2355c029 100644
--- a/spring-boot/spring-boot-soap/pom.xml
+++ b/spring-boot/spring-boot-soap/pom.xml
@@ -13,6 +13,41 @@
spring-boot-soap
1.0.1-SNAPSHOT
+
+ 3.0.3
+
+
+
+
+
+ org.apache.wss4j
+ wss4j-ws-security-dom
+ ${cxf.jakarta.wss4j.version}
+
+
+ org.ehcache
+ ehcache
+
+
+
+
+ org.apache.wss4j
+ wss4j-policy
+ ${cxf.jakarta.wss4j.version}
+
+
+ org.apache.wss4j
+ wss4j-ws-security-stax
+ ${cxf.jakarta.wss4j.version}
+
+
+ org.apache.wss4j
+ wss4j-ws-security-policy-stax
+ ${cxf.jakarta.wss4j.version}
+
+
+
+
org.springframework.boot
diff --git a/spring-boot/spring-boot-soap/src/main/java/io/github/mjhaugsdal/soap/configuration/SoapConfiguration.java b/spring-boot/spring-boot-soap/src/main/java/io/github/mjhaugsdal/soap/configuration/SoapConfiguration.java
index c52b23c5..c14cf64d 100644
--- a/spring-boot/spring-boot-soap/src/main/java/io/github/mjhaugsdal/soap/configuration/SoapConfiguration.java
+++ b/spring-boot/spring-boot-soap/src/main/java/io/github/mjhaugsdal/soap/configuration/SoapConfiguration.java
@@ -43,6 +43,9 @@ public class SoapConfiguration {
@Value("${na.encrypt}")
boolean naEncrypt;
+ @Value("${ecdh:false}")
+ boolean ecdh;
+
@Value("${na.address}")
String naAddress;
@@ -61,7 +64,7 @@ public NAWeb naWeb() throws WSSecurityException {
bean.setServiceClass(NAWeb.class);
bean.setAddress(naAddress + "/NA"); //TODO portkonfig
bean.setFeatures(featureList);
- WSUtils.setupWSSEClient(bean, naEncrypt, naSign);
+ WSUtils.setupWSSEClient(bean, naEncrypt, naSign, ecdh);
return (NAWeb) bean.create();
}
@@ -71,7 +74,7 @@ public RekvirentWeb rekvirentWeb() throws WSSecurityException {
bean.setServiceClass(RekvirentWeb.class);
bean.setAddress(rekvirentAddress + "/Rekvirent"); //TODO portkonfig
bean.setFeatures(featureList);
- WSUtils.setupWSSEClient(bean, rekvirentEncrypt, utlevererSign);
+ WSUtils.setupWSSEClient(bean, rekvirentEncrypt, utlevererSign, ecdh);
return (RekvirentWeb) bean.create();
}
@@ -81,7 +84,7 @@ public UtlevererWeb utlevererWeb() throws WSSecurityException {
bean.setServiceClass(UtlevererWeb.class);
bean.setAddress(utlevererAddress + "/Utleverer"); //TODO portkonfig
bean.setFeatures(featureList);
- WSUtils.setupWSSEClient(bean, utlevererEncrypt, utlevererSign);
+ WSUtils.setupWSSEClient(bean, utlevererEncrypt, utlevererSign, ecdh);
return (UtlevererWeb) bean.create();
}
diff --git a/spring-boot/spring-boot-soap/src/main/java/io/github/mjhaugsdal/soap/util/PasswordCallback.java b/spring-boot/spring-boot-soap/src/main/java/io/github/mjhaugsdal/soap/util/PasswordCallback.java
index 8cd44121..328dd164 100644
--- a/spring-boot/spring-boot-soap/src/main/java/io/github/mjhaugsdal/soap/util/PasswordCallback.java
+++ b/spring-boot/spring-boot-soap/src/main/java/io/github/mjhaugsdal/soap/util/PasswordCallback.java
@@ -14,6 +14,8 @@ public class PasswordCallback implements CallbackHandler {
public PasswordCallback() {
passwords.put("client", "password");
passwords.put("server", "password");
+ passwords.put("client-ecdh", "");
+ passwords.put("server-ecdh", "");
}
@Override
diff --git a/spring-boot/spring-boot-soap/src/main/java/io/github/mjhaugsdal/soap/util/WSUtils.java b/spring-boot/spring-boot-soap/src/main/java/io/github/mjhaugsdal/soap/util/WSUtils.java
index 50f3e287..808a26b0 100644
--- a/spring-boot/spring-boot-soap/src/main/java/io/github/mjhaugsdal/soap/util/WSUtils.java
+++ b/spring-boot/spring-boot-soap/src/main/java/io/github/mjhaugsdal/soap/util/WSUtils.java
@@ -12,7 +12,7 @@
public class WSUtils {
- public static void setupWSSEClient(JaxWsProxyFactoryBean bean, boolean encryption, boolean signature) throws WSSecurityException {
+ public static void setupWSSEClient(JaxWsProxyFactoryBean bean, boolean encryption, boolean signature, boolean ecdh) throws WSSecurityException {
String actions = " ";
if (encryption) {
actions = ConfigurationConstants.ENCRYPTION + " ";
@@ -20,33 +20,52 @@ public static void setupWSSEClient(JaxWsProxyFactoryBean bean, boolean encryptio
if (signature) {
actions += ConfigurationConstants.SIGNATURE;
}
+ String encryptionMethod = "";
+ if (ecdh) {
+ encryptionMethod = "ecdh";
+ }
+
Map inProps = new HashMap<>();
- inProps.put(ConfigurationConstants.SIG_PROP_FILE, "client/client-sign-in.properties");
- inProps.put(ConfigurationConstants.DEC_PROP_FILE, "client/client-enc-in.properties");
+ inProps.put(ConfigurationConstants.SIG_PROP_FILE, "client/" + encryptionMethod + "/client-sign-in.properties");
+ inProps.put(ConfigurationConstants.DEC_PROP_FILE, "client/" + encryptionMethod + "/client-enc-in.properties");
inProps.put(ConfigurationConstants.ACTION, actions);
- inProps.put(ConfigurationConstants.SIGNATURE_USER, "server"); //alias of signing certificate (public key)
- inProps.put(ConfigurationConstants.ENCRYPTION_USER, "client"); //alias of decryption certificate (private key)
inProps.put(ConfigurationConstants.PW_CALLBACK_CLASS, PasswordCallback.class.getName());
var wssIn = new WSS4JInInterceptor(inProps);
Map outProps = new HashMap<>();
- outProps.put(ConfigurationConstants.SIG_PROP_FILE, "client/client-sign-out.properties");
- outProps.put(ConfigurationConstants.ENC_PROP_FILE, "client/client-enc-out.properties");
+ outProps.put(ConfigurationConstants.SIG_PROP_FILE, "client/" + encryptionMethod + "/client-sign-out.properties");
+ outProps.put(ConfigurationConstants.ENC_PROP_FILE, "client/" + encryptionMethod + "/client-enc-out.properties");
outProps.put(ConfigurationConstants.ACTION, actions);
- outProps.put(ConfigurationConstants.SIGNATURE_USER, "client"); //alias of client certificate (private key)
- outProps.put(ConfigurationConstants.ENCRYPTION_USER, "server"); //alias of server certificate (public key)
outProps.put(ConfigurationConstants.PW_CALLBACK_CLASS, PasswordCallback.class.getName());
outProps.put(ConfigurationConstants.ENC_KEY_ID, "DirectReference");
outProps.put(ConfigurationConstants.SIG_KEY_ID, "SKIKeyIdentifier");
outProps.put(ConfigurationConstants.INCLUDE_SIGNATURE_TOKEN, "true");
- outProps.put(ConfigurationConstants.ENC_KEY_TRANSPORT, WSS4JConstants.KEYTRANSPORT_RSAOAEP_XENC11);
- outProps.put(ConfigurationConstants.ENC_SYM_ALGO, WSS4JConstants.AES_256_GCM);
- outProps.put(ConfigurationConstants.SIG_ALGO, WSS4JConstants.RSA_SHA512);
- outProps.put(ConfigurationConstants.SIG_DIGEST_ALGO, WSS4JConstants.SHA512);
- outProps.put(ConfigurationConstants.ENC_MGF_ALGO, WSS4JConstants.MGF_SHA512);
- outProps.put(ConfigurationConstants.ENC_DIGEST_ALGO, WSS4JConstants.SHA512);
+ if (!ecdh) {
+ inProps.put(ConfigurationConstants.SIGNATURE_USER, "server"); //alias of signing certificate (public key)
+ inProps.put(ConfigurationConstants.ENCRYPTION_USER, "client"); //alias of decryption certificate (private key)
+ outProps.put(ConfigurationConstants.SIGNATURE_USER, "client"); //alias of server certificate (private key)
+ outProps.put(ConfigurationConstants.ENCRYPTION_USER, "server"); //alias of server certificate (public key)
+
+ outProps.put(ConfigurationConstants.ENC_KEY_TRANSPORT, WSS4JConstants.KEYTRANSPORT_RSAOAEP_XENC11);
+ outProps.put(ConfigurationConstants.ENC_SYM_ALGO, WSS4JConstants.AES_256_GCM);
+ outProps.put(ConfigurationConstants.ENC_MGF_ALGO, WSS4JConstants.MGF_SHA512);
+ outProps.put(ConfigurationConstants.ENC_DIGEST_ALGO, WSS4JConstants.SHA512);
+ outProps.put(ConfigurationConstants.SIG_ALGO, WSS4JConstants.RSA_SHA512);
+ outProps.put(ConfigurationConstants.SIG_DIGEST_ALGO, WSS4JConstants.SHA512);
+
+ } else {
+ inProps.put(ConfigurationConstants.SIGNATURE_USER, "server-ecdh"); //alias of signing certificate (public key)
+ inProps.put(ConfigurationConstants.ENCRYPTION_USER, "client-ecdh"); //alias of decryption certificate (private key)
+ outProps.put(ConfigurationConstants.SIGNATURE_USER, "client-ecdh"); //alias of server certificate (private key)
+ outProps.put(ConfigurationConstants.ENCRYPTION_USER, "server-ecdh"); //alias of server certificate (public key)
+
+ outProps.put(ConfigurationConstants.ENC_SYM_ALGO, WSS4JConstants.AES_256_GCM);
+ outProps.put(ConfigurationConstants.ENC_KEY_TRANSPORT, WSS4JConstants.KEYWRAP_AES256);
+ outProps.put(ConfigurationConstants.ENC_KEY_AGREEMENT_METHOD, WSS4JConstants.AGREEMENT_METHOD_ECDH_ES);
+ outProps.put(ConfigurationConstants.SIG_ALGO, WSS4JConstants.ECDSA_SHA512);
+ }
var wssOut = new WSS4JOutInterceptor(outProps);
bean.getOutInterceptors().add(wssOut);
diff --git a/spring-boot/spring-boot-soap/src/main/resources/application.yml b/spring-boot/spring-boot-soap/src/main/resources/application.yml
index a45bb934..f46dd41a 100644
--- a/spring-boot/spring-boot-soap/src/main/resources/application.yml
+++ b/spring-boot/spring-boot-soap/src/main/resources/application.yml
@@ -18,4 +18,6 @@ rest:
address: http://localhost:8884/
server:
- port: 8081
\ No newline at end of file
+ port: 8081
+
+ecdh: true
\ No newline at end of file
diff --git a/spring-boot/spring-boot-soap/src/main/resources/client/client-ecdh.p12 b/spring-boot/spring-boot-soap/src/main/resources/client/client-ecdh.p12
new file mode 100644
index 00000000..3b2c29e8
Binary files /dev/null and b/spring-boot/spring-boot-soap/src/main/resources/client/client-ecdh.p12 differ
diff --git a/spring-boot/spring-boot-soap/src/main/resources/client/client-ecdh.pem b/spring-boot/spring-boot-soap/src/main/resources/client/client-ecdh.pem
new file mode 100644
index 00000000..52d70356
--- /dev/null
+++ b/spring-boot/spring-boot-soap/src/main/resources/client/client-ecdh.pem
@@ -0,0 +1,18 @@
+-----BEGIN EC PRIVATE KEY-----
+MHcCAQEEIH8pd4rrJ8cVy8EwCRtG6Fma78dlJTomtFpO8CpXzzHkoAoGCCqGSM49
+AwEHoUQDQgAEcJFR4vrjQ7SynPBuYE6AaYFViyeRsNN4W2xtvnvdg3rUY46W1Kff
+J2B3I1VwE7zEqtltLII7mY4reXM/MbiFwA==
+-----END EC PRIVATE KEY-----
+-----BEGIN CERTIFICATE-----
+MIIB4DCCAYWgAwIBAgIUVhe7IMZgcMZJpSBvBDkVvTjwLZYwCgYIKoZIzj0EAwIw
+RTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGElu
+dGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yNDAzMDQwNjUwNDdaFw0yNTAyMjcw
+NjUwNDdaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYD
+VQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwWTATBgcqhkjOPQIBBggqhkjO
+PQMBBwNCAARwkVHi+uNDtLKc8G5gToBpgVWLJ5Gw03hbbG2+e92DetRjjpbUp98n
+YHcjVXATvMSq2W0sgjuZjit5cz8xuIXAo1MwUTAdBgNVHQ4EFgQUc6IhCsooPFvp
+GccBn1Xvj+/XN5swHwYDVR0jBBgwFoAUc6IhCsooPFvpGccBn1Xvj+/XN5swDwYD
+VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAgNJADBGAiEA+jkSbV4pRkVTz5CC6ILd
+/0YXgh88Pm7u7CUsvo8twVwCIQDYHIL7abeMQn1hfh55W2RqNW+MgXcL9H8NJ7th
+Mcv4sw==
+-----END CERTIFICATE-----
diff --git a/spring-boot/spring-boot-soap/src/main/resources/client/client.keystore b/spring-boot/spring-boot-soap/src/main/resources/client/client.keystore
index 3a53b832..aa9df792 100644
Binary files a/spring-boot/spring-boot-soap/src/main/resources/client/client.keystore and b/spring-boot/spring-boot-soap/src/main/resources/client/client.keystore differ
diff --git a/spring-boot/spring-boot-soap/src/main/resources/client/ecdh/client-enc-in.properties b/spring-boot/spring-boot-soap/src/main/resources/client/ecdh/client-enc-in.properties
new file mode 100644
index 00000000..08751386
--- /dev/null
+++ b/spring-boot/spring-boot-soap/src/main/resources/client/ecdh/client-enc-in.properties
@@ -0,0 +1,5 @@
+org.apache.wss4j.crypto.provider=org.apache.ws.security.components.crypto.Merlin
+org.apache.wss4j.crypto.merlin.keystore.type=jks
+org.apache.wss4j.crypto.merlin.keystore.password=password
+org.apache.wss4j.crypto.merlin.keystore.alias=client-ecdh
+org.apache.wss4j.crypto.merlin.keystore.file=client/client.keystore
\ No newline at end of file
diff --git a/spring-boot/spring-boot-soap/src/main/resources/client/ecdh/client-enc-out.properties b/spring-boot/spring-boot-soap/src/main/resources/client/ecdh/client-enc-out.properties
new file mode 100644
index 00000000..138848cf
--- /dev/null
+++ b/spring-boot/spring-boot-soap/src/main/resources/client/ecdh/client-enc-out.properties
@@ -0,0 +1,5 @@
+org.apache.wss4j.crypto.provider=org.apache.ws.security.components.crypto.Merlin
+org.apache.wss4j.crypto.merlin.keystore.type=jks
+org.apache.wss4j.crypto.merlin.keystore.password=password
+org.apache.wss4j.crypto.merlin.keystore.alias=server-ecdh
+org.apache.wss4j.crypto.merlin.keystore.file=client/client.keystore
\ No newline at end of file
diff --git a/spring-boot/spring-boot-soap/src/main/resources/client/ecdh/client-sign-in.properties b/spring-boot/spring-boot-soap/src/main/resources/client/ecdh/client-sign-in.properties
new file mode 100644
index 00000000..138848cf
--- /dev/null
+++ b/spring-boot/spring-boot-soap/src/main/resources/client/ecdh/client-sign-in.properties
@@ -0,0 +1,5 @@
+org.apache.wss4j.crypto.provider=org.apache.ws.security.components.crypto.Merlin
+org.apache.wss4j.crypto.merlin.keystore.type=jks
+org.apache.wss4j.crypto.merlin.keystore.password=password
+org.apache.wss4j.crypto.merlin.keystore.alias=server-ecdh
+org.apache.wss4j.crypto.merlin.keystore.file=client/client.keystore
\ No newline at end of file
diff --git a/spring-boot/spring-boot-soap/src/main/resources/client/ecdh/client-sign-out.properties b/spring-boot/spring-boot-soap/src/main/resources/client/ecdh/client-sign-out.properties
new file mode 100644
index 00000000..08751386
--- /dev/null
+++ b/spring-boot/spring-boot-soap/src/main/resources/client/ecdh/client-sign-out.properties
@@ -0,0 +1,5 @@
+org.apache.wss4j.crypto.provider=org.apache.ws.security.components.crypto.Merlin
+org.apache.wss4j.crypto.merlin.keystore.type=jks
+org.apache.wss4j.crypto.merlin.keystore.password=password
+org.apache.wss4j.crypto.merlin.keystore.alias=client-ecdh
+org.apache.wss4j.crypto.merlin.keystore.file=client/client.keystore
\ No newline at end of file
diff --git a/spring-boot/spring-boot-soap/src/main/resources/server/ecdh/server-enc-in.properties b/spring-boot/spring-boot-soap/src/main/resources/server/ecdh/server-enc-in.properties
new file mode 100644
index 00000000..23337ec4
--- /dev/null
+++ b/spring-boot/spring-boot-soap/src/main/resources/server/ecdh/server-enc-in.properties
@@ -0,0 +1,5 @@
+org.apache.wss4j.crypto.provider=org.apache.ws.security.components.crypto.Merlin
+org.apache.wss4j.crypto.merlin.keystore.type=jks
+org.apache.wss4j.crypto.merlin.keystore.password=password
+org.apache.wss4j.crypto.merlin.keystore.alias=server-ecdh
+org.apache.wss4j.crypto.merlin.keystore.file=server/server.keystore
diff --git a/spring-boot/spring-boot-soap/src/main/resources/server/ecdh/server-sign-in.properties b/spring-boot/spring-boot-soap/src/main/resources/server/ecdh/server-sign-in.properties
new file mode 100644
index 00000000..b21d1e33
--- /dev/null
+++ b/spring-boot/spring-boot-soap/src/main/resources/server/ecdh/server-sign-in.properties
@@ -0,0 +1,5 @@
+org.apache.wss4j.crypto.provider=org.apache.ws.security.components.crypto.Merlin
+org.apache.wss4j.crypto.merlin.keystore.type=jks
+org.apache.wss4j.crypto.merlin.keystore.password=password
+#org.apache.wss4j.crypto.merlin.keystore.alias=client-ecdh
+org.apache.wss4j.crypto.merlin.keystore.file=server/server.keystore
diff --git a/spring-boot/spring-boot-soap/src/main/resources/server/ecdh/server-sign-out.properties b/spring-boot/spring-boot-soap/src/main/resources/server/ecdh/server-sign-out.properties
new file mode 100644
index 00000000..23337ec4
--- /dev/null
+++ b/spring-boot/spring-boot-soap/src/main/resources/server/ecdh/server-sign-out.properties
@@ -0,0 +1,5 @@
+org.apache.wss4j.crypto.provider=org.apache.ws.security.components.crypto.Merlin
+org.apache.wss4j.crypto.merlin.keystore.type=jks
+org.apache.wss4j.crypto.merlin.keystore.password=password
+org.apache.wss4j.crypto.merlin.keystore.alias=server-ecdh
+org.apache.wss4j.crypto.merlin.keystore.file=server/server.keystore
diff --git a/spring-boot/spring-boot-soap/src/main/resources/server/server.keystore b/spring-boot/spring-boot-soap/src/main/resources/server/server.keystore
index 29194972..d3513fc2 100644
Binary files a/spring-boot/spring-boot-soap/src/main/resources/server/server.keystore and b/spring-boot/spring-boot-soap/src/main/resources/server/server.keystore differ
diff --git a/spring-boot/spring-boot-soap/src/test/java/io/github/mjhaugsdal/soap/WSTestUtils.java b/spring-boot/spring-boot-soap/src/test/java/io/github/mjhaugsdal/soap/WSTestUtils.java
index 23323377..fd2b969b 100644
--- a/spring-boot/spring-boot-soap/src/test/java/io/github/mjhaugsdal/soap/WSTestUtils.java
+++ b/spring-boot/spring-boot-soap/src/test/java/io/github/mjhaugsdal/soap/WSTestUtils.java
@@ -14,7 +14,7 @@
public class WSTestUtils {
- public static void setupWSSEServer(JaxWsServerFactoryBean bean, boolean encryption, boolean signature) {
+ public static void setupWSSEServer(JaxWsServerFactoryBean bean, boolean encryption, boolean signature, boolean ecdh) {
String actions = " ";
if (encryption) {
@@ -24,32 +24,52 @@ public static void setupWSSEServer(JaxWsServerFactoryBean bean, boolean encrypti
actions += ConfigurationConstants.SIGNATURE;
}
+ String encryptionMethod = "";
+ if (ecdh) {
+ encryptionMethod = "ecdh";
+ }
+
Map inProps = new HashMap<>();
- inProps.put(ConfigurationConstants.SIG_PROP_FILE, "server/server-sign-in.properties");
- inProps.put(ConfigurationConstants.DEC_PROP_FILE, "server/server-enc-in.properties");
+ inProps.put(ConfigurationConstants.SIG_PROP_FILE, "server/" + encryptionMethod + "/server-sign-in.properties");
+ inProps.put(ConfigurationConstants.DEC_PROP_FILE, "server/" + encryptionMethod + "/server-enc-in.properties");
inProps.put(ConfigurationConstants.ACTION, actions);
- inProps.put(ConfigurationConstants.SIGNATURE_USER, "client"); //alias of signing certificate (public key)
- inProps.put(ConfigurationConstants.ENCRYPTION_USER, "server"); //alias of decryption certificate (private key)
+
inProps.put(ConfigurationConstants.PW_CALLBACK_CLASS, PasswordCallback.class.getName());
WSS4JInInterceptor wssIn = new WSS4JInInterceptor(inProps);
Map outProps = new HashMap<>();
- outProps.put(ConfigurationConstants.SIG_PROP_FILE, "server/server-sign-out.properties");
+ outProps.put(ConfigurationConstants.SIG_PROP_FILE, "server/" + encryptionMethod + "/server-sign-out.properties");
outProps.put(ConfigurationConstants.ACTION, actions);
- outProps.put(ConfigurationConstants.SIGNATURE_USER, "server"); //alias of server certificate (private key)
outProps.put(ConfigurationConstants.ENCRYPTION_USER, USE_REQ_SIG_CERT); //alias of client certificate (public key)
outProps.put(ConfigurationConstants.ENC_KEY_ID, "DirectReference");
outProps.put(ConfigurationConstants.SIG_KEY_ID, "SKIKeyIdentifier");
outProps.put(ConfigurationConstants.INCLUDE_SIGNATURE_TOKEN, "true");
outProps.put(ConfigurationConstants.PW_CALLBACK_CLASS, PasswordCallback.class.getName());
- outProps.put(ConfigurationConstants.ENC_KEY_TRANSPORT, WSS4JConstants.KEYTRANSPORT_RSAOAEP_XENC11);
- outProps.put(ConfigurationConstants.ENC_SYM_ALGO, WSS4JConstants.AES_256_GCM);
- outProps.put(ConfigurationConstants.SIG_ALGO, WSS4JConstants.RSA_SHA512);
- outProps.put(ConfigurationConstants.SIG_DIGEST_ALGO, WSS4JConstants.SHA512);
- outProps.put(ConfigurationConstants.ENC_MGF_ALGO, WSS4JConstants.MGF_SHA512);
- outProps.put(ConfigurationConstants.ENC_DIGEST_ALGO, WSS4JConstants.SHA512);
+ if (!ecdh) {
+ inProps.put(ConfigurationConstants.SIGNATURE_USER, "client"); //alias of signing certificate (public key)
+ inProps.put(ConfigurationConstants.ENCRYPTION_USER, "server"); //alias of decryption certificate (private key)
+ outProps.put(ConfigurationConstants.SIGNATURE_USER, "server"); //alias of server certificate (private key)
+
+ outProps.put(ConfigurationConstants.ENC_KEY_TRANSPORT, WSS4JConstants.KEYTRANSPORT_RSAOAEP_XENC11);
+ outProps.put(ConfigurationConstants.ENC_SYM_ALGO, WSS4JConstants.AES_256_GCM);
+ outProps.put(ConfigurationConstants.ENC_MGF_ALGO, WSS4JConstants.MGF_SHA512);
+ outProps.put(ConfigurationConstants.ENC_DIGEST_ALGO, WSS4JConstants.SHA512);
+ outProps.put(ConfigurationConstants.SIG_ALGO, WSS4JConstants.RSA_SHA512);
+ outProps.put(ConfigurationConstants.SIG_DIGEST_ALGO, WSS4JConstants.SHA512);
+
+ } else {
+ inProps.put(ConfigurationConstants.SIGNATURE_USER, "client-ecdh"); //alias of signing certificate (public key)
+ inProps.put(ConfigurationConstants.ENCRYPTION_USER, "server-ecdh"); //alias of decryption certificate (private key)
+ outProps.put(ConfigurationConstants.SIGNATURE_USER, "server-ecdh"); //alias of server certificate (private key)
+
+ outProps.put(ConfigurationConstants.ENC_SYM_ALGO, WSS4JConstants.AES_256_GCM);
+ outProps.put(ConfigurationConstants.ENC_KEY_TRANSPORT, WSS4JConstants.KEYWRAP_AES256);
+ outProps.put(ConfigurationConstants.ENC_KEY_AGREEMENT_METHOD, WSS4JConstants.AGREEMENT_METHOD_ECDH_ES);
+ outProps.put(ConfigurationConstants.SIG_ALGO, WSS4JConstants.ECDSA_SHA512);
+// outProps.put(ConfigurationConstants.SIG_DIGEST_ALGO, WSS4JConstants.SHA512);
+ }
WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
bean.getOutInterceptors().add(wssOut);
diff --git a/spring-boot/spring-boot-soap/src/test/java/io/github/mjhaugsdal/soap/configuration/SoapTestConfiguration.java b/spring-boot/spring-boot-soap/src/test/java/io/github/mjhaugsdal/soap/configuration/SoapTestConfiguration.java
index f2b80e80..a840c2f8 100644
--- a/spring-boot/spring-boot-soap/src/test/java/io/github/mjhaugsdal/soap/configuration/SoapTestConfiguration.java
+++ b/spring-boot/spring-boot-soap/src/test/java/io/github/mjhaugsdal/soap/configuration/SoapTestConfiguration.java
@@ -25,8 +25,8 @@ public class SoapTestConfiguration {
static {
System.setProperty("rekvirent.address", "http://localhost:" + TestSocketUtils.findAvailableTcpPort() + "/v1");
- System.setProperty("utleverer.address", "http://localhost:" + TestSocketUtils.findAvailableTcpPort()+ "/v1");
- System.setProperty("na.address", "http://localhost:" + TestSocketUtils.findAvailableTcpPort()+ "/v1");
+ System.setProperty("utleverer.address", "http://localhost:" + TestSocketUtils.findAvailableTcpPort() + "/v1");
+ System.setProperty("na.address", "http://localhost:" + TestSocketUtils.findAvailableTcpPort() + "/v1");
}
@Value("${rekvirent.sign}")
@@ -53,6 +53,9 @@ public class SoapTestConfiguration {
@Value("${na.encrypt}")
boolean naEncrypt;
+ @Value("${ecdh:false}")
+ boolean ecdh;
+
@Value("${na.address}")
String naAddress;
List featureList = new ArrayList<>();
@@ -70,7 +73,7 @@ public Server naEndpoint() {
bean.setServiceBean(new NaWebService());
bean.setAddress(naAddress + "/NA");
bean.setFeatures(featureList);
- setupWSSEServer(bean, naEncrypt, naSign);
+ setupWSSEServer(bean, naEncrypt, naSign, ecdh);
return bean.create();
}
@@ -80,7 +83,7 @@ public Server rekvirentEndpoint() {
bean.setServiceBean(new RekvirentWebservice());
bean.setAddress(rekvirentAddress + "/Rekvirent");
bean.setFeatures(featureList);
- setupWSSEServer(bean, rekvirentEncrypt, rekvirentSign);
+ setupWSSEServer(bean, rekvirentEncrypt, rekvirentSign, ecdh);
return bean.create();
}
@@ -90,7 +93,7 @@ public Server utlevererEndpoint() {
bean.setServiceBean(new UtlevererWebservice());
bean.setAddress(utlevererAddress + "/Utleverer");
bean.setFeatures(featureList);
- setupWSSEServer(bean, utlevererEncrypt, utlevererSign);
+ setupWSSEServer(bean, utlevererEncrypt, utlevererSign, ecdh);
return bean.create();
}
}
diff --git a/spring-boot/spring-boot-soap/src/test/resources/application.yml b/spring-boot/spring-boot-soap/src/test/resources/application.yml
index 3f419d89..e845deaf 100644
--- a/spring-boot/spring-boot-soap/src/test/resources/application.yml
+++ b/spring-boot/spring-boot-soap/src/test/resources/application.yml
@@ -15,4 +15,6 @@ na:
rest:
server:
- address: http://localhost:8884/
\ No newline at end of file
+ address: http://localhost:8884/
+
+ecdh: true
\ No newline at end of file
diff --git a/spring-boot/spring-boot-soap/tree b/spring-boot/spring-boot-soap/tree
new file mode 100644
index 00000000..813dffee
--- /dev/null
+++ b/spring-boot/spring-boot-soap/tree
@@ -0,0 +1,207 @@
+[INFO] Scanning for projects...
+[INFO]
+[INFO] ---------< io.github.mjhaugsdal.spring-boot:spring-boot-soap >----------
+[INFO] Building spring-boot-soap 1.0.1-SNAPSHOT
+[INFO] from pom.xml
+[INFO] --------------------------------[ jar ]---------------------------------
+[INFO]
+[INFO] --- dependency:3.6.1:tree (default-cli) @ spring-boot-soap ---
+[INFO] io.github.mjhaugsdal.spring-boot:spring-boot-soap:jar:1.0.1-SNAPSHOT
+[INFO] +- org.springframework.boot:spring-boot-starter:jar:3.2.3:compile
+[INFO] | +- org.springframework.boot:spring-boot:jar:3.2.3:compile
+[INFO] | | \- org.springframework:spring-context:jar:6.1.4:compile
+[INFO] | +- org.springframework.boot:spring-boot-autoconfigure:jar:3.2.3:compile
+[INFO] | +- org.springframework.boot:spring-boot-starter-logging:jar:3.2.3:compile
+[INFO] | | +- ch.qos.logback:logback-classic:jar:1.4.14:compile
+[INFO] | | | \- ch.qos.logback:logback-core:jar:1.4.14:compile
+[INFO] | | +- org.apache.logging.log4j:log4j-to-slf4j:jar:2.21.1:compile
+[INFO] | | | \- org.apache.logging.log4j:log4j-api:jar:2.21.1:compile
+[INFO] | | \- org.slf4j:jul-to-slf4j:jar:2.0.12:compile
+[INFO] | +- jakarta.annotation:jakarta.annotation-api:jar:2.1.1:compile
+[INFO] | +- org.springframework:spring-core:jar:6.1.4:compile
+[INFO] | | \- org.springframework:spring-jcl:jar:6.1.4:compile
+[INFO] | \- org.yaml:snakeyaml:jar:2.2:compile
+[INFO] +- org.springframework.boot:spring-boot-starter-web:jar:3.2.3:compile
+[INFO] | +- org.springframework.boot:spring-boot-starter-json:jar:3.2.3:compile
+[INFO] | | +- com.fasterxml.jackson.core:jackson-databind:jar:2.15.4:compile
+[INFO] | | | +- com.fasterxml.jackson.core:jackson-annotations:jar:2.15.4:compile
+[INFO] | | | \- com.fasterxml.jackson.core:jackson-core:jar:2.15.4:compile
+[INFO] | | +- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:2.15.4:compile
+[INFO] | | +- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.15.4:compile
+[INFO] | | \- com.fasterxml.jackson.module:jackson-module-parameter-names:jar:2.15.4:compile
+[INFO] | +- org.springframework:spring-web:jar:6.1.4:compile
+[INFO] | | \- org.springframework:spring-beans:jar:6.1.4:compile
+[INFO] | \- org.springframework:spring-webmvc:jar:6.1.4:compile
+[INFO] | +- org.springframework:spring-aop:jar:6.1.4:compile
+[INFO] | \- org.springframework:spring-expression:jar:6.1.4:compile
+[INFO] +- io.github.mjhaugsdal:apprec-2004-11-21:jar:4.2.0:compile
+[INFO] +- io.github.mjhaugsdal:er-m9na1-2016-06-06:jar:4.2.0:compile
+[INFO] | \- io.github.mjhaugsdal:felleskomponent1:jar:4.2.0:compile
+[INFO] +- io.github.mjhaugsdal:er-m9na2-2016-10-26:jar:4.2.0:compile
+[INFO] +- io.github.mjhaugsdal:er-m9na3-2016-06-06:jar:4.2.0:compile
+[INFO] +- io.github.mjhaugsdal:er-m9na4-2016-06-06:jar:4.2.0:compile
+[INFO] +- io.github.mjhaugsdal:kith:jar:4.2.0:compile
+[INFO] +- io.github.mjhaugsdal:kith-base64:jar:4.2.0:compile
+[INFO] +- io.github.mjhaugsdal:msghead-2006-05-24:jar:4.2.0:compile
+[INFO] +- io.github.mjhaugsdal:messages:jar:1.0.1-SNAPSHOT:compile
+[INFO] | +- org.opensaml:opensaml-core:jar:4.0.1:compile
+[INFO] | | +- com.google.code.findbugs:jsr305:jar:3.0.2:compile
+[INFO] | | +- com.google.guava:guava:jar:28.2-jre:compile
+[INFO] | | | +- com.google.guava:failureaccess:jar:1.0.1:compile
+[INFO] | | | +- com.google.guava:listenablefuture:jar:9999.0-empty-to-avoid-conflict-with-guava:compile
+[INFO] | | | +- org.checkerframework:checker-qual:jar:2.10.0:compile
+[INFO] | | | +- com.google.errorprone:error_prone_annotations:jar:2.3.4:compile
+[INFO] | | | \- com.google.j2objc:j2objc-annotations:jar:1.3:compile
+[INFO] | | +- io.dropwizard.metrics:metrics-core:jar:4.2.25:compile
+[INFO] | | \- net.shibboleth.utilities:java-support:jar:8.0.0:compile
+[INFO] | +- org.opensaml:opensaml-saml-api:jar:4.0.1:compile
+[INFO] | | +- org.opensaml:opensaml-messaging-api:jar:4.0.1:compile
+[INFO] | | +- org.opensaml:opensaml-profile-api:jar:4.0.1:compile
+[INFO] | | +- org.opensaml:opensaml-security-api:jar:4.0.1:compile
+[INFO] | | | +- org.cryptacular:cryptacular:jar:1.2.4:compile
+[INFO] | | | +- org.bouncycastle:bcprov-jdk15on:jar:1.64:compile
+[INFO] | | | \- org.bouncycastle:bcpkix-jdk15on:jar:1.64:compile
+[INFO] | | \- org.opensaml:opensaml-soap-api:jar:4.0.1:compile
+[INFO] | +- org.opensaml:opensaml-xmlsec-api:jar:4.0.1:compile
+[INFO] | +- org.opensaml:opensaml-saml-impl:jar:4.0.1:compile
+[INFO] | | +- org.opensaml:opensaml-security-impl:jar:4.0.1:compile
+[INFO] | | +- org.opensaml:opensaml-soap-impl:jar:4.0.1:compile
+[INFO] | | +- org.opensaml:opensaml-storage-api:jar:4.0.1:compile
+[INFO] | | +- org.opensaml:opensaml-xmlsec-impl:jar:4.0.1:compile
+[INFO] | | +- org.apache.velocity:velocity-engine-core:jar:2.2:compile
+[INFO] | | | \- org.apache.commons:commons-lang3:jar:3.13.0:compile
+[INFO] | | +- org.apache.httpcomponents:httpclient:jar:4.5.12:compile
+[INFO] | | \- org.apache.httpcomponents:httpcore:jar:4.4.16:compile
+[INFO] | \- com.sun.xml.bind:jaxb-impl:jar:4.0.4:runtime
+[INFO] | \- com.sun.xml.bind:jaxb-core:jar:4.0.4:runtime
+[INFO] +- org.apache.cxf:cxf-rt-transports-http-netty-server:jar:4.0.3:compile
+[INFO] | +- io.netty:netty-codec-http:jar:4.1.107.Final:compile
+[INFO] | | +- io.netty:netty-common:jar:4.1.107.Final:compile
+[INFO] | | +- io.netty:netty-buffer:jar:4.1.107.Final:compile
+[INFO] | | +- io.netty:netty-transport:jar:4.1.107.Final:compile
+[INFO] | | | \- io.netty:netty-resolver:jar:4.1.107.Final:compile
+[INFO] | | +- io.netty:netty-codec:jar:4.1.107.Final:compile
+[INFO] | | \- io.netty:netty-handler:jar:4.1.107.Final:compile
+[INFO] | | \- io.netty:netty-transport-native-unix-common:jar:4.1.107.Final:compile
+[INFO] | \- jakarta.servlet:jakarta.servlet-api:jar:6.0.0:compile
+[INFO] +- org.apache.cxf:cxf-rt-transports-http:jar:4.0.3:compile
+[INFO] | \- org.apache.cxf:cxf-core:jar:4.0.3:compile
+[INFO] | +- org.glassfish.jaxb:jaxb-runtime:jar:4.0.4:compile
+[INFO] | | \- org.glassfish.jaxb:jaxb-core:jar:4.0.4:compile
+[INFO] | | +- org.glassfish.jaxb:txw2:jar:4.0.4:compile
+[INFO] | | \- com.sun.istack:istack-commons-runtime:jar:4.1.2:compile
+[INFO] | +- org.apache.ws.xmlschema:xmlschema-core:jar:2.3.1:compile
+[INFO] | \- org.eclipse.angus:angus-activation:jar:2.0.1:compile
+[INFO] +- org.apache.cxf:cxf-rt-features-logging:jar:4.0.3:compile
+[INFO] | \- org.slf4j:slf4j-api:jar:2.0.12:compile
+[INFO] +- org.apache.cxf:cxf-rt-rs-service-description-openapi-v3:jar:4.0.3:compile
+[INFO] | +- org.apache.cxf:cxf-rt-frontend-jaxrs:jar:4.0.3:compile
+[INFO] | | +- jakarta.ws.rs:jakarta.ws.rs-api:jar:3.1.0:compile
+[INFO] | | \- org.apache.cxf:cxf-rt-security:jar:4.0.3:compile
+[INFO] | +- org.apache.cxf:cxf-rt-rs-service-description-common-openapi:jar:4.0.3:compile
+[INFO] | +- org.apache.cxf:cxf-rt-rs-service-description-swagger-ui:jar:4.0.3:compile
+[INFO] | \- io.swagger.core.v3:swagger-jaxrs2-jakarta:jar:2.2.15:compile
+[INFO] | +- io.github.classgraph:classgraph:jar:4.8.154:compile
+[INFO] | +- org.javassist:javassist:jar:3.29.2-GA:compile
+[INFO] | +- io.swagger.core.v3:swagger-models-jakarta:jar:2.2.15:compile
+[INFO] | +- io.swagger.core.v3:swagger-annotations-jakarta:jar:2.2.15:compile
+[INFO] | +- io.swagger.core.v3:swagger-integration-jakarta:jar:2.2.15:compile
+[INFO] | | \- io.swagger.core.v3:swagger-core-jakarta:jar:2.2.15:compile
+[INFO] | | \- com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:jar:2.15.4:compile
+[INFO] | \- com.fasterxml.jackson.jakarta.rs:jackson-jakarta-rs-json-provider:jar:2.15.4:compile
+[INFO] | +- com.fasterxml.jackson.jakarta.rs:jackson-jakarta-rs-base:jar:2.15.4:compile
+[INFO] | \- com.fasterxml.jackson.module:jackson-module-jakarta-xmlbind-annotations:jar:2.15.4:compile
+[INFO] +- org.webjars:swagger-ui:jar:4.1.2:compile
+[INFO] +- io.swagger.core.v3:swagger-annotations:jar:2.2.11:compile
+[INFO] +- org.apache.cxf:cxf-rt-ws-security:jar:4.0.3:compile
+[INFO] | +- org.apache.cxf:cxf-rt-bindings-soap:jar:4.0.3:compile
+[INFO] | | +- jakarta.jws:jakarta.jws-api:jar:3.0.0:compile
+[INFO] | | +- org.apache.cxf:cxf-rt-wsdl:jar:4.0.3:compile
+[INFO] | | | \- wsdl4j:wsdl4j:jar:1.6.3:compile
+[INFO] | | \- org.apache.cxf:cxf-rt-databinding-jaxb:jar:4.0.3:compile
+[INFO] | +- org.apache.cxf:cxf-rt-security-saml:jar:4.0.3:compile
+[INFO] | +- org.ehcache:ehcache:jar:jakarta:3.10.8:compile
+[INFO] | | \- javax.cache:cache-api:jar:1.1.1:compile
+[INFO] | +- org.apache.wss4j:wss4j-ws-security-dom:jar:3.0.3:compile
+[INFO] | | \- org.apache.wss4j:wss4j-ws-security-common:jar:3.0.3:compile
+[INFO] | | +- jakarta.mail:jakarta.mail-api:jar:2.1.2:compile
+[INFO] | | +- org.opensaml:opensaml-xacml-impl:jar:4.3.0:compile
+[INFO] | | | \- org.opensaml:opensaml-xacml-api:jar:4.3.0:compile
+[INFO] | | +- org.opensaml:opensaml-xacml-saml-impl:jar:4.3.0:compile
+[INFO] | | | \- org.opensaml:opensaml-xacml-saml-api:jar:4.3.0:compile
+[INFO] | | \- org.jasypt:jasypt:jar:1.9.3:compile
+[INFO] | +- org.apache.wss4j:wss4j-policy:jar:3.0.3:compile
+[INFO] | | \- org.apache.neethi:neethi:jar:3.2.0:compile
+[INFO] | +- org.apache.wss4j:wss4j-ws-security-stax:jar:3.0.3:compile
+[INFO] | | \- org.apache.wss4j:wss4j-bindings:jar:3.0.3:compile
+[INFO] | +- com.sun.xml.messaging.saaj:saaj-impl:jar:3.0.3:compile
+[INFO] | | \- org.jvnet.staxex:stax-ex:jar:2.1.0:compile
+[INFO] | \- org.apache.wss4j:wss4j-ws-security-policy-stax:jar:3.0.3:compile
+[INFO] +- org.springframework.boot:spring-boot-starter-test:jar:3.2.3:test
+[INFO] | +- org.springframework.boot:spring-boot-test-autoconfigure:jar:3.2.3:test
+[INFO] | +- com.jayway.jsonpath:json-path:jar:2.9.0:test
+[INFO] | +- net.minidev:json-smart:jar:2.5.0:test
+[INFO] | | \- net.minidev:accessors-smart:jar:2.5.0:test
+[INFO] | +- org.assertj:assertj-core:jar:3.24.2:test
+[INFO] | | \- net.bytebuddy:byte-buddy:jar:1.14.12:test
+[INFO] | +- org.awaitility:awaitility:jar:4.2.0:test
+[INFO] | +- org.hamcrest:hamcrest:jar:2.2:test
+[INFO] | +- org.mockito:mockito-core:jar:5.7.0:test
+[INFO] | | +- net.bytebuddy:byte-buddy-agent:jar:1.14.12:test
+[INFO] | | \- org.objenesis:objenesis:jar:3.3:test
+[INFO] | +- org.mockito:mockito-junit-jupiter:jar:5.7.0:test
+[INFO] | +- org.skyscreamer:jsonassert:jar:1.5.1:test
+[INFO] | | \- com.vaadin.external.google:android-json:jar:0.0.20131108.vaadin1:test
+[INFO] | +- org.springframework:spring-test:jar:6.1.4:test
+[INFO] | \- org.xmlunit:xmlunit-core:jar:2.9.1:test
+[INFO] +- org.apache.cxf:cxf-spring-boot-starter-jaxws:jar:4.0.3:compile
+[INFO] | +- org.apache.cxf:cxf-spring-boot-autoconfigure:jar:4.0.3:compile
+[INFO] | +- org.apache.cxf:cxf-rt-frontend-jaxws:jar:4.0.3:compile
+[INFO] | | +- xml-resolver:xml-resolver:jar:1.2:compile
+[INFO] | | +- org.ow2.asm:asm:jar:9.5:compile
+[INFO] | | +- org.apache.cxf:cxf-rt-bindings-xml:jar:4.0.3:compile
+[INFO] | | +- org.apache.cxf:cxf-rt-frontend-simple:jar:4.0.3:compile
+[INFO] | | | \- org.eclipse.angus:angus-mail:jar:2.0.2:compile
+[INFO] | | \- org.apache.cxf:cxf-rt-ws-addr:jar:4.0.3:compile
+[INFO] | | \- org.apache.cxf:cxf-rt-ws-policy:jar:4.0.3:compile
+[INFO] | +- jakarta.validation:jakarta.validation-api:jar:3.0.2:compile
+[INFO] | \- org.springframework.boot:spring-boot-starter-validation:jar:3.2.3:compile
+[INFO] | +- org.apache.tomcat.embed:tomcat-embed-el:jar:10.1.19:compile
+[INFO] | \- org.hibernate.validator:hibernate-validator:jar:8.0.1.Final:compile
+[INFO] | +- org.jboss.logging:jboss-logging:jar:3.5.3.Final:compile
+[INFO] | \- com.fasterxml:classmate:jar:1.6.0:compile
+[INFO] +- org.apache.cxf:cxf-spring-boot-starter-jaxrs:jar:4.0.3:compile
+[INFO] | \- org.apache.cxf:cxf-rt-rs-client:jar:4.0.3:compile
+[INFO] +- org.springframework.boot:spring-boot-starter-actuator:jar:3.2.3:compile
+[INFO] | +- org.springframework.boot:spring-boot-actuator-autoconfigure:jar:3.2.3:compile
+[INFO] | | \- org.springframework.boot:spring-boot-actuator:jar:3.2.3:compile
+[INFO] | +- io.micrometer:micrometer-observation:jar:1.12.3:compile
+[INFO] | | \- io.micrometer:micrometer-commons:jar:1.12.3:compile
+[INFO] | \- io.micrometer:micrometer-jakarta9:jar:1.12.3:compile
+[INFO] | \- io.micrometer:micrometer-core:jar:1.12.3:compile
+[INFO] | +- org.hdrhistogram:HdrHistogram:jar:2.1.12:runtime
+[INFO] | \- org.latencyutils:LatencyUtils:jar:2.0.3:runtime
+[INFO] +- org.apache.cxf:cxf-rt-features-metrics:jar:4.0.3:compile
+[INFO] +- jakarta.xml.bind:jakarta.xml.bind-api:jar:4.0.1:compile
+[INFO] | \- jakarta.activation:jakarta.activation-api:jar:2.1.2:compile
+[INFO] +- jakarta.xml.soap:jakarta.xml.soap-api:jar:3.0.1:compile
+[INFO] +- jakarta.xml.ws:jakarta.xml.ws-api:jar:4.0.1:compile
+[INFO] +- org.apache.santuario:xmlsec:jar:4.0.2:compile
+[INFO] | +- commons-codec:commons-codec:jar:1.16.1:compile
+[INFO] | \- com.fasterxml.woodstox:woodstox-core:jar:6.6.0:compile
+[INFO] | \- org.codehaus.woodstox:stax2-api:jar:4.2.2:compile
+[INFO] +- org.junit.jupiter:junit-jupiter:jar:5.10.2:test
+[INFO] | +- org.junit.jupiter:junit-jupiter-api:jar:5.10.2:test
+[INFO] | | +- org.opentest4j:opentest4j:jar:1.3.0:test
+[INFO] | | +- org.junit.platform:junit-platform-commons:jar:1.10.2:test
+[INFO] | | \- org.apiguardian:apiguardian-api:jar:1.1.2:test
+[INFO] | +- org.junit.jupiter:junit-jupiter-params:jar:5.10.2:test
+[INFO] | \- org.junit.jupiter:junit-jupiter-engine:jar:5.10.2:test
+[INFO] | \- org.junit.platform:junit-platform-engine:jar:1.10.2:test
+[INFO] \- org.springframework.boot:spring-boot-test:jar:3.2.3:test
+[INFO] ------------------------------------------------------------------------
+[INFO] BUILD SUCCESS
+[INFO] ------------------------------------------------------------------------
+[INFO] Total time: 2.280 s
+[INFO] Finished at: 2024-03-04T08:15:33+01:00
+[INFO] ------------------------------------------------------------------------