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] ------------------------------------------------------------------------