diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/config/PropertyInitialization.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/config/PropertyInitialization.java index 9a9c47fb47e6171e6b650755cac4f225ee9e9cda..5e28aeab3e1f5441bf1cee32cbc15bfe67239912 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/config/PropertyInitialization.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/config/PropertyInitialization.java @@ -141,7 +141,7 @@ public class PropertyInitialization { } public void initTruststore(String absolutePath, File fEncryption, EntityManager em, Properties properties, Properties fileProperties, boolean testMode) { - LOG.info("Start generating new truststore."); + LOG.info("Start initialization of the truststore."); String encTrustEncToken; if (fileProperties.containsKey(SMPPropertyEnum.TRUSTSTORE_PASSWORD.getProperty())) { LOG.info("get token from properties"); @@ -192,36 +192,63 @@ public class PropertyInitialization { } } - public void initAndMergeKeystore(String absolutePath, File fEncryption, EntityManager em, Properties initProperties, - Properties fileProperties, boolean testMode) { - LOG.info("Start generating new keystore. mode [{}]", testMode?"dev":"prod"); - // store keystore password filename - String newKeyPassword = SecurityUtils.generateAuthenticationToken(testMode); - storeDBEntry(em, SMPPropertyEnum.KEYSTORE_PASSWORD_DECRYPTED, newKeyPassword); - String encPasswd = SecurityUtils.encrypt(fEncryption, newKeyPassword); - storeDBEntry(em, SMPPropertyEnum.KEYSTORE_PASSWORD, encPasswd); - initProperties.setProperty(SMPPropertyEnum.KEYSTORE_PASSWORD.getProperty(), encPasswd); - - //store new keystore - File keystore = getNewFile(absolutePath, SMPPropertyEnum.KEYSTORE_FILENAME.getDefValue()); - LOG.info("Create file [{}]", keystore.getAbsolutePath()); + public void initKeystore(String absolutePath, File fEncryption, EntityManager em, Properties initProperties, + Properties fileProperties, boolean testMode) { + + LOG.info("Start initialization of the keystore."); + String encKeystoreToken; + if (fileProperties.containsKey(SMPPropertyEnum.KEYSTORE_PASSWORD.getProperty())) { + LOG.debug("Get keystore token from the init properties"); + encKeystoreToken = SecurityUtils.encryptWrappedToken(fEncryption, + fileProperties.getProperty(SMPPropertyEnum.KEYSTORE_PASSWORD.getProperty())); + } else { + // generate new token + LOG.debug("Generate keystore token"); + String trustToken = SecurityUtils.generateAuthenticationToken(testMode); + storeDBEntry(em, SMPPropertyEnum.KEYSTORE_PASSWORD_DECRYPTED, trustToken); + encKeystoreToken = SecurityUtils.encrypt(fEncryption, trustToken); + } + LOG.debug("Store keystore security token to database"); + // store token to database + storeDBEntry(em, SMPPropertyEnum.KEYSTORE_PASSWORD, encKeystoreToken); + initProperties.setProperty(SMPPropertyEnum.KEYSTORE_PASSWORD.getProperty(), encKeystoreToken); + + LOG.debug("Decode security token"); + String trustToken = SecurityUtils.decrypt(fEncryption, encKeystoreToken); + LOG.info("Initialize keystore file!"); + File keystore; + if (fileProperties.containsKey(SMPPropertyEnum.KEYSTORE_FILENAME.getProperty())) { + LOG.debug("Get keystore filename from property file"); + keystore = new File(absolutePath, fileProperties.getProperty( + SMPPropertyEnum.KEYSTORE_FILENAME.getProperty())); + + } else { + LOG.info("Create new keystore file "); + keystore = getNewFile(absolutePath, SMPPropertyEnum.KEYSTORE_FILENAME.getDefValue()); + } + LOG.debug("Set SMP keystore to file [{}]!", keystore.getAbsolutePath()); + // store file to database storeDBEntry(em, SMPPropertyEnum.KEYSTORE_FILENAME, keystore.getName()); initProperties.setProperty(SMPPropertyEnum.KEYSTORE_FILENAME.getProperty(), keystore.getName()); - try (FileOutputStream out = new FileOutputStream(keystore)) { - KeyStore newKeystore = KeyStore.getInstance(KeyStore.getDefaultType()); - // initialize keystore - newKeystore.load(null, newKeyPassword.toCharArray()); - // check if keystore is empty then generate cert for user - if (newKeystore.size() == 0) { - X509CertificateUtils.createAndStoreCertificateWithChain( - new String[]{TEST_CERT_ISSUER_DN, TEST_CERT_SUBJECT_DN}, - new String[]{TEST_CERT_ISSUER_ALIAS, TEST_CERT_CERT_ALIAS}, - newKeystore, newKeyPassword); + // if truststore does not exist create a new file + if (!keystore.exists()) { + LOG.info("Generate new truststore file {}.", keystore.getAbsolutePath()); + try (FileOutputStream out = new FileOutputStream(keystore)) { + KeyStore newKeystore = KeyStore.getInstance(KeyStore.getDefaultType()); + // initialize keystore + newKeystore.load(null, trustToken.toCharArray()); + // check if keystore is empty then generate cert for user + if (newKeystore.size() == 0) { + X509CertificateUtils.createAndStoreCertificateWithChain( + new String[]{TEST_CERT_ISSUER_DN, TEST_CERT_SUBJECT_DN}, + new String[]{TEST_CERT_ISSUER_ALIAS, TEST_CERT_CERT_ALIAS}, + newKeystore, trustToken); + } + newKeystore.store(out, trustToken.toCharArray()); + } catch (Exception e) { + throw new SMPRuntimeException(INTERNAL_ERROR, e, "Exception occurred while creating truststore", ExceptionUtils.getRootCauseMessage(e)); } - newKeystore.store(out, newKeyPassword.toCharArray()); - } catch (Exception e) { - throw new SMPRuntimeException(INTERNAL_ERROR, e, "Exception occurred while creating keystore", ExceptionUtils.getRootCauseMessage(e)); } } @@ -278,7 +305,7 @@ public class PropertyInitialization { // init truststore initTruststore(absolutePath, fEncryption, em, initProperties, fileProperties, devMode); - initAndMergeKeystore(absolutePath, fEncryption, em, initProperties, fileProperties, devMode); + initKeystore(absolutePath, fEncryption, em, initProperties, fileProperties, devMode); return fEncryption; }