KeystoreUtils.java

  1. /*
  2.  * GovWay - A customizable API Gateway
  3.  * https://govway.org
  4.  *
  5.  * Copyright (c) 2005-2025 Link.it srl (https://link.it).
  6.  *
  7.  * This program is free software: you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License version 3, as published by
  9.  * the Free Software Foundation.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  18.  *
  19.  */
  20. package org.openspcoop2.security.message.utils;

  21. import java.io.File;
  22. import java.io.FileNotFoundException;
  23. import java.net.URI;
  24. import java.net.URISyntaxException;
  25. import java.util.HashMap;
  26. import java.util.Properties;

  27. import org.apache.commons.lang.StringUtils;
  28. import org.openspcoop2.core.constants.Costanti;
  29. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  30. import org.openspcoop2.security.SecurityException;
  31. import org.openspcoop2.security.keystore.KeystoreConstants;
  32. import org.openspcoop2.security.keystore.MerlinKeystore;
  33. import org.openspcoop2.security.keystore.MerlinTruststore;
  34. import org.openspcoop2.security.keystore.MultiKeystore;
  35. import org.openspcoop2.security.keystore.SymmetricKeystore;
  36. import org.openspcoop2.security.keystore.cache.GestoreKeystoreCache;
  37. import org.openspcoop2.security.message.MessageSecurityContext;
  38. import org.openspcoop2.security.message.constants.SecurityConstants;
  39. import org.openspcoop2.utils.UtilsException;
  40. import org.openspcoop2.utils.certificate.JWKSet;
  41. import org.openspcoop2.utils.certificate.KeyStore;
  42. import org.openspcoop2.utils.certificate.byok.BYOKProvider;
  43. import org.openspcoop2.utils.certificate.byok.BYOKRequestParams;
  44. import org.openspcoop2.utils.resources.FileSystemUtilities;
  45. import org.openspcoop2.utils.transport.http.HttpResponse;
  46. import org.openspcoop2.utils.transport.http.HttpUtilities;

  47. /**
  48.  * KeystoreUtils
  49.  *
  50.  * @author Andrea Poli (apoli@link.it)
  51.  * @author $Author$
  52.  * @version $Rev$, $Date$
  53.  */
  54. public class KeystoreUtils {
  55.    
  56.     private KeystoreUtils() {}

  57.     private static final String PREFIX_ALIAS = "Alias ";
  58.     private static final String SUFFIX_NON_FORNITA = " non fornita";
  59.     private static final String SUFFIX_NON_TROVATO_MULTIKEYSTORE = " non trovato nella configurazione MultiKeystore";
  60.    
  61.     public static EncryptionBean getSenderEncryptionBean(MessageSecurityContext messageSecurityContext, org.openspcoop2.utils.Map<Object> ctx) throws UtilsException, SecurityException, FileNotFoundException, URISyntaxException {
  62.        
  63.         if(messageSecurityContext.getEncryptionBean()!=null) {
  64.             return messageSecurityContext.getEncryptionBean();
  65.         }
  66.        
  67.         RequestInfo requestInfo = null;
  68.         if(ctx!=null && ctx.containsKey(Costanti.REQUEST_INFO)) {
  69.             requestInfo = (RequestInfo) ctx.get(Costanti.REQUEST_INFO);
  70.         }
  71.        
  72.         MultiKeystore multiKeystore = null;
  73.         JWKSet encryptionJWKSet = null;
  74.         KeyStore encryptionKS = null;
  75.         KeyStore encryptionTrustStoreKS = null;
  76.         boolean encryptionSymmetric = false;
  77.         String aliasEncryptUser = null;
  78.         String aliasEncryptPassword = null;
  79.         // Alias Chiave/Certificato per Encrypt
  80.         aliasEncryptUser = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.ENCRYPTION_USER);
  81.         if(aliasEncryptUser==null){
  82.             aliasEncryptUser = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.USER);
  83.             if(aliasEncryptUser==null){
  84.                 throw new UtilsException(SecurityConstants.ENCRYPTION_USER+"/"+SecurityConstants.USER+SUFFIX_NON_FORNITA);
  85.             }
  86.         }

  87.         // Leggo Modalita' di encrypt (Symmetric/Asymmetric)
  88.         Object encryptionSymmetricObject = messageSecurityContext.getOutgoingProperties().get(SecurityConstants.ENCRYPTION_SYMMETRIC);
  89.         if(encryptionSymmetricObject!=null){
  90.             encryptionSymmetric = SecurityConstants.TRUE.equals(encryptionSymmetricObject);
  91.         }
  92.         // 0.a TrustStore
  93.         String encryptionTrustStore = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.ENCRYPTION_TRUSTSTORE_PROPERTY_FILE);
  94.         // 0.b TrustStore as properties
  95.         Object oEncryptionTrustStoreProperties = messageSecurityContext.getOutgoingProperties().get(SecurityConstants.ENCRYPTION_TRUSTSTORE_PROPERTY_REF_ID);
  96.         Properties encryptionTrustStoreProperties = null;
  97.         if(oEncryptionTrustStoreProperties!=null) {
  98.             encryptionTrustStoreProperties = (Properties) oEncryptionTrustStoreProperties;
  99.         }
  100.         // 1.a Property Merlin
  101.         String encryptionStore = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.ENCRYPTION_PROPERTY_FILE);
  102.         // 1.b Property Merlin as properties
  103.         Object oEncryptionStoreProperties = messageSecurityContext.getOutgoingProperties().get(SecurityConstants.ENCRYPTION_PROPERTY_REF_ID);
  104.         Properties encryptionStoreProperties = null;
  105.         if(oEncryptionStoreProperties!=null) {
  106.             encryptionStoreProperties = (Properties) oEncryptionStoreProperties;
  107.         }
  108.         // 2. Multi Property
  109.         String multiEncryptionStore = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.ENCRYPTION_MULTI_PROPERTY_FILE);
  110.         // 3. In caso di chiave simmetrica provo a vedere se e' stata fornita direttamente una chiave
  111.         String encryptionSymmetricKeyValue = null;
  112.         if(encryptionSymmetric){
  113.             encryptionSymmetricKeyValue = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.ENCRYPTION_SYMMETRIC_KEY_VALUE);
  114.         }
  115.         // 4 JWKSet
  116.         String encryptionJWKSetFile = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.ENCRYPTION_JWK_SET_FILE);
  117.        
  118.            
  119.         // Istanzione truststore
  120.         // 0. TrustStore
  121.         if(encryptionTrustStore!=null){
  122.             MerlinTruststore merlinTruststore = GestoreKeystoreCache.getMerlinTruststore(requestInfo, encryptionTrustStore);
  123.             encryptionTrustStoreKS = merlinTruststore.getTrustStore();
  124.         }
  125.         else if(encryptionTrustStoreProperties!=null){
  126.             MerlinTruststore merlinTruststore = null;
  127.             String storePath = encryptionTrustStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PATH);
  128.             String storeType = encryptionTrustStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_TYPE);
  129.             String storePassword = encryptionTrustStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PASSWORD);
  130.             if(StringUtils.isNotEmpty(storePath) && StringUtils.isNotEmpty(storeType) && StringUtils.isNotEmpty(storePassword)) {
  131.                 merlinTruststore = GestoreKeystoreCache.getMerlinTruststore(requestInfo, storePath, storeType, storePassword);
  132.             }
  133.             else {
  134.                 merlinTruststore = new MerlinTruststore(encryptionTrustStoreProperties);
  135.             }
  136.             encryptionTrustStoreKS = merlinTruststore.getTrustStore();
  137.         }

  138.         // Istanzio keystore
  139.         // 1. Property Merlin
  140.         if(encryptionStore!=null || encryptionStoreProperties!=null){
  141.             aliasEncryptPassword = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.ENCRYPTION_PASSWORD);
  142.             if(aliasEncryptPassword==null){
  143.                 throw new UtilsException(SecurityConstants.ENCRYPTION_PASSWORD+SUFFIX_NON_FORNITA);
  144.             }
  145.         }
  146.         if(encryptionStore!=null){
  147.             MerlinKeystore merlinKeystore = GestoreKeystoreCache.getMerlinKeystore(requestInfo, encryptionStore, aliasEncryptPassword);
  148.             encryptionKS = merlinKeystore.getKeyStore();
  149.         }
  150.         else if(encryptionStoreProperties!=null){
  151.             MerlinKeystore merlinKeystore = null;
  152.             String storePath = encryptionStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PATH);
  153.             String storeType = encryptionStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_TYPE);
  154.             String storePassword = encryptionStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PASSWORD);
  155.            
  156.             BYOKRequestParams byokParams = getBYOKRequestParams(requestInfo, encryptionStoreProperties);
  157.            
  158.             if(StringUtils.isNotEmpty(storePath) && StringUtils.isNotEmpty(storeType) && StringUtils.isNotEmpty(storePassword)) {
  159.                 merlinKeystore = GestoreKeystoreCache.getMerlinKeystore(requestInfo, storePath, storeType, storePassword, aliasEncryptPassword, byokParams);
  160.             }
  161.             else {
  162.                 merlinKeystore = new MerlinKeystore(encryptionStoreProperties, aliasEncryptPassword);
  163.             }
  164.             encryptionKS = merlinKeystore.getKeyStore();
  165.         }
  166.         // 2. Multi Property
  167.         else if(multiEncryptionStore!=null){
  168.             multiKeystore = GestoreKeystoreCache.getMultiKeystore(requestInfo, multiEncryptionStore);
  169.             if(SecurityConstants.MULTI_USER_KEYWORD_FRUITORE.equals(aliasEncryptUser) &&
  170.                     messageSecurityContext.getIdFruitore()!=null && messageSecurityContext.getIdFruitore().getNome()!=null){
  171.                 String fruitore = messageSecurityContext.getIdFruitore().getNome();
  172.                 encryptionKS = multiKeystore.getKeyStore(fruitore);
  173.                 aliasEncryptUser = multiKeystore.getKeyAlias(fruitore);
  174.                 aliasEncryptPassword = multiKeystore.getKeyPassword(fruitore);
  175.             }
  176.             else if(SecurityConstants.MULTI_USER_KEYWORD_EROGATORE.equals(aliasEncryptUser) &&
  177.                     messageSecurityContext.getIdServizio()!=null &&
  178.                     messageSecurityContext.getIdServizio().getSoggettoErogatore()!=null &&
  179.                     messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome()!=null){
  180.                 String erogatore = messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome();
  181.                 encryptionKS = multiKeystore.getKeyStore(erogatore);
  182.                 aliasEncryptUser = multiKeystore.getKeyAlias(erogatore);
  183.                 aliasEncryptPassword = multiKeystore.getKeyPassword(erogatore);
  184.             }
  185.             else if(SecurityConstants.MULTI_USER_KEYWORD_FRUITORE_EROGATORE.equals(aliasEncryptUser) &&
  186.                     messageSecurityContext.getIdFruitore()!=null && messageSecurityContext.getIdFruitore().getNome()!=null &&
  187.                     messageSecurityContext.getIdServizio()!=null &&
  188.                     messageSecurityContext.getIdServizio().getSoggettoErogatore()!=null &&
  189.                     messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome()!=null){
  190.                 String fruitore = messageSecurityContext.getIdFruitore().getNome();
  191.                 String erogatore = messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome();
  192.                 String aliasFruitoreErogatore = fruitore+"-"+erogatore;
  193.                 String aliasErogatoreFruitore = erogatore+"-"+fruitore;
  194.                 if(multiKeystore.existsAlias(aliasFruitoreErogatore)){
  195.                     encryptionKS = multiKeystore.getKeyStore(aliasFruitoreErogatore);
  196.                     aliasEncryptUser = multiKeystore.getKeyAlias(aliasFruitoreErogatore);
  197.                     aliasEncryptPassword = multiKeystore.getKeyPassword(aliasFruitoreErogatore);
  198.                 }
  199.                 else if(multiKeystore.existsAlias(aliasErogatoreFruitore)){
  200.                     encryptionKS = multiKeystore.getKeyStore(aliasErogatoreFruitore);
  201.                     aliasEncryptUser = multiKeystore.getKeyAlias(aliasErogatoreFruitore);
  202.                     aliasEncryptPassword = multiKeystore.getKeyPassword(aliasErogatoreFruitore);
  203.                 }
  204.                 else{
  205.                     throw new UtilsException(PREFIX_ALIAS+"["+aliasFruitoreErogatore+"]"+" o "+"["+aliasErogatoreFruitore+"]"+SUFFIX_NON_TROVATO_MULTIKEYSTORE);
  206.                 }
  207.             }
  208.             else if(SecurityConstants.MULTI_USER_KEYWORD_PORTA_DOMINIO_FRUITORE.equals(aliasEncryptUser) &&
  209.                     messageSecurityContext.getPddFruitore()!=null){
  210.                 String fruitore = messageSecurityContext.getPddFruitore();
  211.                 encryptionKS = multiKeystore.getKeyStore(fruitore);
  212.                 aliasEncryptUser = multiKeystore.getKeyAlias(fruitore);
  213.                 aliasEncryptPassword = multiKeystore.getKeyPassword(fruitore);
  214.             }
  215.             else if(SecurityConstants.MULTI_USER_KEYWORD_PORTA_DOMINIO_EROGATORE.equals(aliasEncryptUser) &&
  216.                     messageSecurityContext.getPddErogatore()!=null){
  217.                 String erogatore = messageSecurityContext.getPddErogatore();
  218.                 encryptionKS = multiKeystore.getKeyStore(erogatore);
  219.                 aliasEncryptUser = multiKeystore.getKeyAlias(erogatore);
  220.                 aliasEncryptPassword = multiKeystore.getKeyPassword(erogatore);
  221.             }
  222.             else if(SecurityConstants.MULTI_USER_KEYWORD_IDENTIFICATIVO_PORTA_FRUITORE.equals(aliasEncryptUser) &&
  223.                     messageSecurityContext.getIdFruitore()!=null && messageSecurityContext.getIdFruitore().getCodicePorta()!=null){
  224.                 String fruitore = messageSecurityContext.getIdFruitore().getCodicePorta();
  225.                 encryptionKS = multiKeystore.getKeyStore(fruitore);
  226.                 aliasEncryptUser = multiKeystore.getKeyAlias(fruitore);
  227.                 aliasEncryptPassword = multiKeystore.getKeyPassword(fruitore);
  228.             }
  229.             else if(SecurityConstants.MULTI_USER_KEYWORD_IDENTIFICATIVO_PORTA_EROGATORE.equals(aliasEncryptUser) &&
  230.                     messageSecurityContext.getIdServizio()!=null &&
  231.                     messageSecurityContext.getIdServizio().getSoggettoErogatore()!=null &&
  232.                     messageSecurityContext.getIdServizio().getSoggettoErogatore().getCodicePorta()!=null){
  233.                 String erogatore = messageSecurityContext.getIdServizio().getSoggettoErogatore().getCodicePorta();
  234.                 encryptionKS = multiKeystore.getKeyStore(erogatore);
  235.                 aliasEncryptUser = multiKeystore.getKeyAlias(erogatore);
  236.                 aliasEncryptPassword = multiKeystore.getKeyPassword(erogatore);
  237.             }
  238.             else{
  239.                 encryptionKS = multiKeystore.getKeyStore(aliasEncryptUser);
  240.                 aliasEncryptPassword = multiKeystore.getKeyPassword(aliasEncryptUser);
  241.                 aliasEncryptUser = multiKeystore.getKeyAlias(aliasEncryptUser); // aggiorno con identita alias del keystore
  242.             }
  243.         }
  244.         // 3. In caso di chiave simmetrica provo a vedere se e' stata fornita direttamente una chiave
  245.         else if(encryptionSymmetricKeyValue!=null){
  246.             Object encryptionSymmetricAlgoritm = messageSecurityContext.getOutgoingProperties().get(SecurityConstants.ENCRYPTION_SYMMETRIC_ALGORITHM);
  247.             if(encryptionSymmetricAlgoritm==null){
  248.                 throw new UtilsException("E' stata indicata una funzionalita' di encrypt con chiave simmetrica fornita direttamente nelle proprieta' ["+
  249.                         SecurityConstants.ENCRYPTION_SYMMETRIC_KEY_VALUE+"="+encryptionSymmetricKeyValue+"], ma non e' stato indicato l'algoritmo associato tramite la proprieta' "+
  250.                         SecurityConstants.ENCRYPTION_SYMMETRIC_ALGORITHM);
  251.             }
  252.             SymmetricKeystore symmetricKeystore = GestoreKeystoreCache.getSymmetricKeystore(requestInfo, aliasEncryptUser, encryptionSymmetricKeyValue, (String)encryptionSymmetricAlgoritm);
  253.             encryptionKS = symmetricKeystore.getKeyStore();
  254.             aliasEncryptPassword = symmetricKeystore.getPasswordKey();
  255.         }
  256.        
  257.         // Istanzio JWKSet
  258.         if(encryptionJWKSetFile!=null) {
  259.             encryptionJWKSet = new JWKSet(new String(readResources(encryptionJWKSetFile)));
  260.         }
  261.        
  262.         if(encryptionKS==null && encryptionTrustStoreKS==null && encryptionJWKSet==null) {
  263.             throw new UtilsException("Nessuna modalita' di recupero del Keystore per la funzionalita' di Encryption indicata");
  264.         }

  265.         EncryptionBean bean = new EncryptionBean();
  266.        
  267.         bean.setKeystore(encryptionKS);
  268.         bean.setTruststore(encryptionTrustStoreKS);
  269.         bean.setJwkSet(encryptionJWKSet);
  270.         bean.setUser(aliasEncryptUser);
  271.         bean.setPassword(aliasEncryptPassword);
  272.         bean.setEncryptionSimmetric(encryptionSymmetric);
  273.         bean.setMultiKeystore(multiKeystore);
  274.        
  275.         return bean;
  276.     }
  277.     public static EncryptionBean getReceiverEncryptionBean(MessageSecurityContext messageSecurityContext, org.openspcoop2.utils.Map<Object> ctx) throws UtilsException, SecurityException, FileNotFoundException, URISyntaxException {

  278.         if(messageSecurityContext.getEncryptionBean()!=null) {
  279.             return messageSecurityContext.getEncryptionBean();
  280.         }
  281.        
  282.         RequestInfo requestInfo = null;
  283.         if(ctx!=null && ctx.containsKey(Costanti.REQUEST_INFO)) {
  284.             requestInfo = (RequestInfo) ctx.get(Costanti.REQUEST_INFO);
  285.         }
  286.        
  287.         MultiKeystore multiKeystore = null;
  288.         JWKSet decryptionJWKSet = null;
  289.         KeyStore decryptionKS = null;
  290.         KeyStore decryptionTrustStoreKS = null;
  291.         String aliasDecryptUser = null;
  292.         String aliasDecryptPassword = null;
  293.         boolean decryptionSymmetric = false;
  294.         // Alias Chiave/Certificato per Encrypt
  295.         aliasDecryptUser = (String) messageSecurityContext.getIncomingProperties().get(SecurityConstants.DECRYPTION_USER);
  296.         if(aliasDecryptUser==null){
  297.             aliasDecryptUser = (String) messageSecurityContext.getIncomingProperties().get(SecurityConstants.USER);
  298.             if(aliasDecryptUser==null){
  299.                 throw new UtilsException(SecurityConstants.DECRYPTION_USER+"/"+SecurityConstants.USER+SUFFIX_NON_FORNITA);
  300.             }
  301.         }
  302.        
  303.         // Leggo Modalita' di encrypt (Symmetric/Asymmetric)
  304.         Object decryptionSymmetricObject = messageSecurityContext.getIncomingProperties().get(SecurityConstants.DECRYPTION_SYMMETRIC);
  305.         if(decryptionSymmetricObject!=null){
  306.             decryptionSymmetric = SecurityConstants.TRUE.equals(decryptionSymmetricObject);
  307.         }
  308.         // 0.a TrustStore
  309.         String decryptionTrustStore = (String) messageSecurityContext.getIncomingProperties().get(SecurityConstants.DECRYPTION_TRUSTSTORE_PROPERTY_FILE);
  310.         // 0.b TrustStore as properties
  311.         Object oDecryptionTrustStoreProperties = messageSecurityContext.getIncomingProperties().get(SecurityConstants.DECRYPTION_TRUSTSTORE_PROPERTY_REF_ID);
  312.         Properties decryptionTrustStoreProperties = null;
  313.         if(oDecryptionTrustStoreProperties!=null) {
  314.             decryptionTrustStoreProperties = (Properties) oDecryptionTrustStoreProperties;
  315.         }
  316.         // 1.a Property Merlin
  317.         String decryptionStore = (String) messageSecurityContext.getIncomingProperties().get(SecurityConstants.DECRYPTION_PROPERTY_FILE);
  318.         // 1.b Property Merlin as properties
  319.         Object oDecryptionStoreProperties = messageSecurityContext.getIncomingProperties().get(SecurityConstants.DECRYPTION_PROPERTY_REF_ID);
  320.         Properties decryptionStoreProperties = null;
  321.         if(oDecryptionStoreProperties!=null) {
  322.             decryptionStoreProperties = (Properties) oDecryptionStoreProperties;
  323.         }
  324.         // 2. Multi Property
  325.         String multiDecryptionStore = (String) messageSecurityContext.getIncomingProperties().get(SecurityConstants.DECRYPTION_MULTI_PROPERTY_FILE);
  326.         // 3. In caso di chiave simmetrica provo a vedere se e' stata fornita direttamente una chiave
  327.         String decryptionSymmetricKeyValue = null;
  328.         if(decryptionSymmetric){
  329.             decryptionSymmetricKeyValue = (String) messageSecurityContext.getIncomingProperties().get(SecurityConstants.DECRYPTION_SYMMETRIC_KEY_VALUE);
  330.         }
  331.         // 4 JWKSet
  332.         String decryptionJWKSetFile = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.DECRYPTION_JWK_SET_FILE);
  333.                
  334.        
  335.         // Istanzione truststore
  336.         // 0. TrustStore
  337.         if(decryptionTrustStore!=null){
  338.             MerlinTruststore merlinTruststore = GestoreKeystoreCache.getMerlinTruststore(requestInfo, decryptionTrustStore);
  339.             decryptionTrustStoreKS = merlinTruststore.getTrustStore();
  340.         }
  341.         else if(decryptionTrustStoreProperties!=null){
  342.             MerlinTruststore merlinTruststore = null;
  343.             String storePath = decryptionTrustStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PATH);
  344.             String storeType = decryptionTrustStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_TYPE);
  345.             String storePassword = decryptionTrustStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PASSWORD);
  346.             if(StringUtils.isNotEmpty(storePath) && StringUtils.isNotEmpty(storeType) && StringUtils.isNotEmpty(storePassword)) {
  347.                 merlinTruststore = GestoreKeystoreCache.getMerlinTruststore(requestInfo, storePath, storeType, storePassword);
  348.             }
  349.             else {
  350.                 merlinTruststore = new MerlinTruststore(decryptionTrustStoreProperties);
  351.             }
  352.             decryptionTrustStoreKS = merlinTruststore.getTrustStore();
  353.         }
  354.        
  355.         // Istanzio keystore
  356.         // 1. Property Merlin
  357.         if(decryptionStore!=null || decryptionStoreProperties!=null){
  358.             aliasDecryptPassword = (String) messageSecurityContext.getIncomingProperties().get(SecurityConstants.DECRYPTION_PASSWORD);
  359.             if(aliasDecryptPassword==null){
  360.                 throw new UtilsException(SecurityConstants.DECRYPTION_PASSWORD+SUFFIX_NON_FORNITA);
  361.             }
  362.         }
  363.         if(decryptionStore!=null){
  364.             MerlinKeystore merlinKeystore = GestoreKeystoreCache.getMerlinKeystore(requestInfo, decryptionStore, aliasDecryptPassword);
  365.             decryptionKS = merlinKeystore.getKeyStore();
  366.         }
  367.         else if(decryptionStoreProperties!=null){
  368.             MerlinKeystore merlinKeystore = null;
  369.             String storePath = decryptionStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PATH);
  370.             String storeType = decryptionStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_TYPE);
  371.             String storePassword = decryptionStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PASSWORD);
  372.            
  373.             BYOKRequestParams byokParams = getBYOKRequestParams(requestInfo, decryptionStoreProperties);
  374.            
  375.             if(StringUtils.isNotEmpty(storePath) && StringUtils.isNotEmpty(storeType) && StringUtils.isNotEmpty(storePassword)) {
  376.                 merlinKeystore = GestoreKeystoreCache.getMerlinKeystore(requestInfo, storePath, storeType, storePassword, aliasDecryptPassword, byokParams);
  377.             }
  378.             else {
  379.                 merlinKeystore = new MerlinKeystore(decryptionStoreProperties, aliasDecryptPassword);
  380.             }
  381.             decryptionKS = merlinKeystore.getKeyStore();
  382.         }
  383.         // 2. Multi Property
  384.         else if(multiDecryptionStore!=null){
  385.             multiKeystore = GestoreKeystoreCache.getMultiKeystore(requestInfo, multiDecryptionStore);
  386.             if(SecurityConstants.MULTI_USER_KEYWORD_FRUITORE.equals(aliasDecryptUser) &&
  387.                     messageSecurityContext.getIdFruitore()!=null && messageSecurityContext.getIdFruitore().getNome()!=null){
  388.                 String fruitore = messageSecurityContext.getIdFruitore().getNome();
  389.                 decryptionKS = multiKeystore.getKeyStore(fruitore);
  390.                 aliasDecryptUser = multiKeystore.getKeyAlias(fruitore);
  391.                 aliasDecryptPassword = multiKeystore.getKeyPassword(fruitore);
  392.             }
  393.             else if(SecurityConstants.MULTI_USER_KEYWORD_EROGATORE.equals(aliasDecryptUser) &&
  394.                     messageSecurityContext.getIdServizio()!=null &&
  395.                     messageSecurityContext.getIdServizio().getSoggettoErogatore()!=null &&
  396.                     messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome()!=null){
  397.                 String erogatore = messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome();
  398.                 decryptionKS = multiKeystore.getKeyStore(erogatore);
  399.                 aliasDecryptUser = multiKeystore.getKeyAlias(erogatore);
  400.                 aliasDecryptPassword = multiKeystore.getKeyPassword(erogatore);
  401.             }
  402.             else if(SecurityConstants.MULTI_USER_KEYWORD_FRUITORE_EROGATORE.equals(aliasDecryptUser) &&
  403.                     messageSecurityContext.getIdFruitore()!=null && messageSecurityContext.getIdFruitore().getNome()!=null &&
  404.                     messageSecurityContext.getIdServizio()!=null &&
  405.                     messageSecurityContext.getIdServizio().getSoggettoErogatore()!=null &&
  406.                     messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome()!=null){
  407.                 String fruitore = messageSecurityContext.getIdFruitore().getNome();
  408.                 String erogatore = messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome();
  409.                 String aliasFruitoreErogatore = fruitore+"-"+erogatore;
  410.                 String aliasErogatoreFruitore = erogatore+"-"+fruitore;
  411.                 if(multiKeystore.existsAlias(aliasFruitoreErogatore)){
  412.                     decryptionKS = multiKeystore.getKeyStore(aliasFruitoreErogatore);
  413.                     aliasDecryptUser = multiKeystore.getKeyAlias(aliasFruitoreErogatore);
  414.                     aliasDecryptPassword = multiKeystore.getKeyPassword(aliasFruitoreErogatore);
  415.                 }
  416.                 else if(multiKeystore.existsAlias(aliasErogatoreFruitore)){
  417.                     decryptionKS = multiKeystore.getKeyStore(aliasErogatoreFruitore);
  418.                     aliasDecryptUser = multiKeystore.getKeyAlias(aliasErogatoreFruitore);
  419.                     aliasDecryptPassword = multiKeystore.getKeyPassword(aliasErogatoreFruitore);
  420.                 }
  421.                 else{
  422.                     throw new UtilsException(PREFIX_ALIAS+"["+aliasFruitoreErogatore+"] o ["+aliasErogatoreFruitore+"]"+SUFFIX_NON_TROVATO_MULTIKEYSTORE);
  423.                 }
  424.             }
  425.             else if(SecurityConstants.MULTI_USER_KEYWORD_PORTA_DOMINIO_FRUITORE.equals(aliasDecryptUser) &&
  426.                     messageSecurityContext.getPddFruitore()!=null){
  427.                 String fruitore = messageSecurityContext.getPddFruitore();
  428.                 decryptionKS = multiKeystore.getKeyStore(fruitore);
  429.                 aliasDecryptUser = multiKeystore.getKeyAlias(fruitore);
  430.                 aliasDecryptPassword = multiKeystore.getKeyPassword(fruitore);
  431.             }
  432.             else if(SecurityConstants.MULTI_USER_KEYWORD_PORTA_DOMINIO_EROGATORE.equals(aliasDecryptUser) &&
  433.                     messageSecurityContext.getPddErogatore()!=null){
  434.                 String erogatore = messageSecurityContext.getPddErogatore();
  435.                 decryptionKS = multiKeystore.getKeyStore(erogatore);
  436.                 aliasDecryptUser = multiKeystore.getKeyAlias(erogatore);
  437.                 aliasDecryptPassword = multiKeystore.getKeyPassword(erogatore);
  438.             }
  439.             else if(SecurityConstants.MULTI_USER_KEYWORD_IDENTIFICATIVO_PORTA_FRUITORE.equals(aliasDecryptUser) &&
  440.                     messageSecurityContext.getIdFruitore()!=null && messageSecurityContext.getIdFruitore().getCodicePorta()!=null){
  441.                 String fruitore = messageSecurityContext.getIdFruitore().getCodicePorta();
  442.                 decryptionKS = multiKeystore.getKeyStore(fruitore);
  443.                 aliasDecryptUser = multiKeystore.getKeyAlias(fruitore);
  444.                 aliasDecryptPassword = multiKeystore.getKeyPassword(fruitore);
  445.             }
  446.             else if(SecurityConstants.MULTI_USER_KEYWORD_IDENTIFICATIVO_PORTA_EROGATORE.equals(aliasDecryptUser) &&
  447.                     messageSecurityContext.getIdServizio()!=null &&
  448.                     messageSecurityContext.getIdServizio().getSoggettoErogatore()!=null &&
  449.                     messageSecurityContext.getIdServizio().getSoggettoErogatore().getCodicePorta()!=null){
  450.                 String erogatore = messageSecurityContext.getIdServizio().getSoggettoErogatore().getCodicePorta();
  451.                 decryptionKS = multiKeystore.getKeyStore(erogatore);
  452.                 aliasDecryptUser = multiKeystore.getKeyAlias(erogatore);
  453.                 aliasDecryptPassword = multiKeystore.getKeyPassword(erogatore);
  454.             }
  455.             else{
  456.                 decryptionKS = multiKeystore.getKeyStore(aliasDecryptUser);
  457.                 aliasDecryptPassword = multiKeystore.getKeyPassword(aliasDecryptUser);
  458.                 aliasDecryptUser = multiKeystore.getKeyAlias(aliasDecryptUser); // aggiorno con identita alias del keystore
  459.             }
  460.         }
  461.         // 3. In caso di chiave simmetrica provo a vedere se e' stata fornita direttamente una chiave
  462.         else if(decryptionSymmetricKeyValue!=null){
  463.             Object decryptionSymmetricAlgoritm = messageSecurityContext.getIncomingProperties().get(SecurityConstants.DECRYPTION_SYMMETRIC_ALGORITHM);
  464.             if(decryptionSymmetricAlgoritm==null){
  465.                 throw new UtilsException("E' stata indicata una funzionalita' di encrypt con chiave simmetrica fornita direttamente nelle proprieta' ["+
  466.                         SecurityConstants.DECRYPTION_SYMMETRIC_KEY_VALUE+"="+decryptionSymmetricKeyValue+"], ma non e' stato indicato l'algoritmo associato tramite la proprieta' "+

  467.                         SecurityConstants.DECRYPTION_SYMMETRIC_ALGORITHM);
  468.             }
  469.             SymmetricKeystore symmetricKeystore = GestoreKeystoreCache.getSymmetricKeystore(requestInfo, aliasDecryptUser, decryptionSymmetricKeyValue, (String)decryptionSymmetricAlgoritm);
  470.             decryptionKS = symmetricKeystore.getKeyStore();
  471.             aliasDecryptPassword = symmetricKeystore.getPasswordKey();
  472.         }
  473.         // 4. Provo a vedere se è stato fornito un JWKSet
  474.         else if(decryptionJWKSetFile!=null) {
  475.             decryptionJWKSet = new JWKSet(new String(readResources(decryptionJWKSetFile)));
  476.         }
  477.         else{
  478.             throw new UtilsException("Nessuna modalita' di recupero del Keystore per la funzionalita' di Encryption indicata");
  479.         }
  480.        

  481.         EncryptionBean bean = new EncryptionBean();
  482.        
  483.         bean.setKeystore(decryptionKS);
  484.         bean.setTruststore(decryptionTrustStoreKS);
  485.         bean.setJwkSet(decryptionJWKSet);
  486.         bean.setUser(aliasDecryptUser);
  487.         bean.setPassword(aliasDecryptPassword);
  488.         bean.setEncryptionSimmetric(decryptionSymmetric);
  489.         bean.setMultiKeystore(multiKeystore);

  490.         return bean;
  491.     }

  492.     public static SignatureBean getSenderSignatureBean(MessageSecurityContext messageSecurityContext, org.openspcoop2.utils.Map<Object> ctx) throws UtilsException, SecurityException, FileNotFoundException, URISyntaxException {

  493.         if(messageSecurityContext.getSignatureBean()!=null) {
  494.             return messageSecurityContext.getSignatureBean();
  495.         }
  496.        
  497.         RequestInfo requestInfo = null;
  498.         if(ctx!=null && ctx.containsKey(Costanti.REQUEST_INFO)) {
  499.             requestInfo = (RequestInfo) ctx.get(Costanti.REQUEST_INFO);
  500.         }
  501.        
  502.         MultiKeystore multiKeystore = null;
  503.         JWKSet signatureJWKSet = null;
  504.         KeyStore signatureKS = null;
  505.         KeyStore signatureTrustStoreKS = null;
  506.         String aliasSignatureUser = null;
  507.         String aliasSignaturePassword = null;
  508.         // Alias Chiave/Certificato per Signature
  509.         aliasSignatureUser = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.SIGNATURE_USER);
  510.         if(aliasSignatureUser==null){
  511.             aliasSignatureUser = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.USER);
  512.             if(aliasSignatureUser==null){
  513.                 throw new UtilsException(SecurityConstants.SIGNATURE_USER+"/"+SecurityConstants.USER+SUFFIX_NON_FORNITA);
  514.             }
  515.         }

  516.         // 0.a TrustStore
  517.         String signatureTrustStore = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.SIGNATURE_TRUSTSTORE_PROPERTY_FILE);
  518.         // 0.b TrustStore as properties
  519.         Object oSignatureTrustStoreProperties = messageSecurityContext.getOutgoingProperties().get(SecurityConstants.SIGNATURE_TRUSTSTORE_PROPERTY_REF_ID);
  520.         Properties signatureTrustStoreProperties = null;
  521.         if(oSignatureTrustStoreProperties!=null) {
  522.             signatureTrustStoreProperties = (Properties) oSignatureTrustStoreProperties;
  523.         }
  524.         // 1.a Property Merlin
  525.         String signatureStore = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.SIGNATURE_PROPERTY_FILE);
  526.         // 1.b Property Merlin as properties
  527.         Object oSignatureStoreProperties = messageSecurityContext.getOutgoingProperties().get(SecurityConstants.SIGNATURE_PROPERTY_REF_ID);
  528.         Properties signatureStoreProperties = null;
  529.         if(oSignatureStoreProperties!=null) {
  530.             signatureStoreProperties = (Properties) oSignatureStoreProperties;
  531.         }
  532.         // 2. Multi Property
  533.         String multiSignatureStore = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.SIGNATURE_MULTI_PROPERTY_FILE);
  534.         // 3 JWKSet
  535.         String signatureJWKSetFile = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.SIGNATURE_JWK_SET_FILE);
  536.                
  537.        
  538.         // Istanzione truststore
  539.         // 0. TrustStore
  540.         if(signatureTrustStore!=null){
  541.             MerlinTruststore merlinTruststore = GestoreKeystoreCache.getMerlinTruststore(requestInfo, signatureTrustStore);
  542.             signatureTrustStoreKS = merlinTruststore.getTrustStore();
  543.         }
  544.         else if(signatureTrustStoreProperties!=null) {
  545.             MerlinTruststore merlinTruststore = null;
  546.             String storePath = signatureTrustStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PATH);
  547.             String storeType = signatureTrustStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_TYPE);
  548.             String storePassword = signatureTrustStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PASSWORD);
  549.             if(StringUtils.isNotEmpty(storePath) && StringUtils.isNotEmpty(storeType) && StringUtils.isNotEmpty(storePassword)) {
  550.                 merlinTruststore = GestoreKeystoreCache.getMerlinTruststore(requestInfo, storePath, storeType, storePassword);
  551.             }
  552.             else {
  553.                 merlinTruststore = new MerlinTruststore(signatureTrustStoreProperties);
  554.             }
  555.             signatureTrustStoreKS = merlinTruststore.getTrustStore();
  556.         }

  557.         // Istanzio keystore
  558.         // 1. Property Merlin
  559.         if(signatureStore!=null || signatureStoreProperties!=null){
  560.             aliasSignaturePassword = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.SIGNATURE_PASSWORD);
  561.             if(aliasSignaturePassword==null){
  562.                 throw new UtilsException(SecurityConstants.SIGNATURE_PASSWORD+SUFFIX_NON_FORNITA);
  563.             }
  564.         }
  565.         if(signatureStore!=null){  
  566.             MerlinKeystore merlinKeystore = GestoreKeystoreCache.getMerlinKeystore(requestInfo, signatureStore, aliasSignaturePassword);
  567.             signatureKS = merlinKeystore.getKeyStore();
  568.         }
  569.         else if(signatureStoreProperties!=null) {
  570.             MerlinKeystore merlinKeystore = null;
  571.             String storePath = signatureStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PATH);
  572.             String storeType = signatureStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_TYPE);
  573.             String storePassword = signatureStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PASSWORD);
  574.            
  575.             BYOKRequestParams byokParams = getBYOKRequestParams(requestInfo, signatureStoreProperties);
  576.            
  577.             if(StringUtils.isNotEmpty(storePath) && StringUtils.isNotEmpty(storeType) && StringUtils.isNotEmpty(storePassword)) {
  578.                 merlinKeystore = GestoreKeystoreCache.getMerlinKeystore(requestInfo, storePath, storeType, storePassword, aliasSignaturePassword, byokParams);
  579.             }
  580.             else {
  581.                 merlinKeystore = new MerlinKeystore(signatureStoreProperties, aliasSignaturePassword);
  582.             }
  583.             signatureKS = merlinKeystore.getKeyStore();
  584.         }
  585.         // 2. Multi Property
  586.         else if(multiSignatureStore!=null){
  587.             multiKeystore = GestoreKeystoreCache.getMultiKeystore(requestInfo, multiSignatureStore);
  588.             if(SecurityConstants.MULTI_USER_KEYWORD_FRUITORE.equals(aliasSignatureUser) &&
  589.                     messageSecurityContext.getIdFruitore()!=null && messageSecurityContext.getIdFruitore().getNome()!=null){
  590.                 String fruitore = messageSecurityContext.getIdFruitore().getNome();
  591.                 signatureKS = multiKeystore.getKeyStore(fruitore);
  592.                 aliasSignatureUser = multiKeystore.getKeyAlias(fruitore);
  593.                 aliasSignaturePassword = multiKeystore.getKeyPassword(fruitore);
  594.             }
  595.             else if(SecurityConstants.MULTI_USER_KEYWORD_EROGATORE.equals(aliasSignatureUser) &&
  596.                     messageSecurityContext.getIdServizio()!=null &&
  597.                     messageSecurityContext.getIdServizio().getSoggettoErogatore()!=null &&
  598.                     messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome()!=null){
  599.                 String erogatore = messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome();
  600.                 signatureKS = multiKeystore.getKeyStore(erogatore);
  601.                 aliasSignatureUser = multiKeystore.getKeyAlias(erogatore);
  602.                 aliasSignaturePassword = multiKeystore.getKeyPassword(erogatore);
  603.             }
  604.             else if(SecurityConstants.MULTI_USER_KEYWORD_FRUITORE_EROGATORE.equals(aliasSignatureUser) &&
  605.                     messageSecurityContext.getIdFruitore()!=null && messageSecurityContext.getIdFruitore().getNome()!=null &&
  606.                     messageSecurityContext.getIdServizio()!=null &&
  607.                     messageSecurityContext.getIdServizio().getSoggettoErogatore()!=null &&
  608.                     messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome()!=null){
  609.                 String fruitore = messageSecurityContext.getIdFruitore().getNome();
  610.                 String erogatore = messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome();
  611.                 String aliasFruitoreErogatore = fruitore+"-"+erogatore;
  612.                 String aliasErogatoreFruitore = erogatore+"-"+fruitore;
  613.                 if(multiKeystore.existsAlias(aliasFruitoreErogatore)){
  614.                     signatureKS = multiKeystore.getKeyStore(aliasFruitoreErogatore);
  615.                     aliasSignatureUser = multiKeystore.getKeyAlias(aliasFruitoreErogatore);
  616.                     aliasSignaturePassword = multiKeystore.getKeyPassword(aliasFruitoreErogatore);
  617.                 }
  618.                 else if(multiKeystore.existsAlias(aliasErogatoreFruitore)){
  619.                     signatureKS = multiKeystore.getKeyStore(aliasErogatoreFruitore);
  620.                     aliasSignatureUser = multiKeystore.getKeyAlias(aliasErogatoreFruitore);
  621.                     aliasSignaturePassword = multiKeystore.getKeyPassword(aliasErogatoreFruitore);
  622.                 }
  623.                 else{
  624.                     throw new UtilsException(PREFIX_ALIAS+"["+aliasFruitoreErogatore+"] o ["+aliasErogatoreFruitore+"]"+SUFFIX_NON_TROVATO_MULTIKEYSTORE);
  625.                 }
  626.             }
  627.             else if(SecurityConstants.MULTI_USER_KEYWORD_PORTA_DOMINIO_FRUITORE.equals(aliasSignatureUser) &&
  628.                     messageSecurityContext.getPddFruitore()!=null){
  629.                 String fruitore = messageSecurityContext.getPddFruitore();
  630.                 signatureKS = multiKeystore.getKeyStore(fruitore);
  631.                 aliasSignatureUser = multiKeystore.getKeyAlias(fruitore);
  632.                 aliasSignaturePassword = multiKeystore.getKeyPassword(fruitore);
  633.             }
  634.             else if(SecurityConstants.MULTI_USER_KEYWORD_PORTA_DOMINIO_EROGATORE.equals(aliasSignatureUser) &&
  635.                     messageSecurityContext.getPddErogatore()!=null){
  636.                 String erogatore = messageSecurityContext.getPddErogatore();
  637.                 signatureKS = multiKeystore.getKeyStore(erogatore);
  638.                 aliasSignatureUser = multiKeystore.getKeyAlias(erogatore);
  639.                 aliasSignaturePassword = multiKeystore.getKeyPassword(erogatore);
  640.             }
  641.             else if(SecurityConstants.MULTI_USER_KEYWORD_IDENTIFICATIVO_PORTA_FRUITORE.equals(aliasSignatureUser) &&
  642.                     messageSecurityContext.getIdFruitore()!=null && messageSecurityContext.getIdFruitore().getCodicePorta()!=null){
  643.                 String fruitore = messageSecurityContext.getIdFruitore().getCodicePorta();
  644.                 signatureKS = multiKeystore.getKeyStore(fruitore);
  645.                 aliasSignatureUser = multiKeystore.getKeyAlias(fruitore);
  646.                 aliasSignaturePassword = multiKeystore.getKeyPassword(fruitore);
  647.             }
  648.             else if(SecurityConstants.MULTI_USER_KEYWORD_IDENTIFICATIVO_PORTA_EROGATORE.equals(aliasSignatureUser) &&
  649.                     messageSecurityContext.getIdServizio()!=null &&
  650.                     messageSecurityContext.getIdServizio().getSoggettoErogatore()!=null &&
  651.                     messageSecurityContext.getIdServizio().getSoggettoErogatore().getCodicePorta()!=null){
  652.                 String erogatore = messageSecurityContext.getIdServizio().getSoggettoErogatore().getCodicePorta();
  653.                 signatureKS = multiKeystore.getKeyStore(erogatore);
  654.                 aliasSignatureUser = multiKeystore.getKeyAlias(erogatore);
  655.                 aliasSignaturePassword = multiKeystore.getKeyPassword(erogatore);
  656.             }
  657.             else{
  658.                 signatureKS = multiKeystore.getKeyStore(aliasSignatureUser);
  659.                 aliasSignaturePassword = multiKeystore.getKeyPassword(aliasSignatureUser);
  660.                 aliasSignatureUser = multiKeystore.getKeyAlias(aliasSignatureUser); // aggiorno con identita alias del keystore
  661.             }
  662.         }
  663.         // 3. Provo a vedere se è stato fornito un JWKSet
  664.         else if(signatureJWKSetFile!=null) {
  665.             signatureJWKSet = new JWKSet(new String(readResources(signatureJWKSetFile)));
  666.         }
  667.         else{
  668.             throw new UtilsException("Nessuna modalita' di recupero del Keystore per la funzionalita' di Signature indicata");
  669.         }

  670.         SignatureBean bean = new SignatureBean();
  671.         bean.setKeystore(signatureKS);
  672.         bean.setTruststore(signatureTrustStoreKS);
  673.         bean.setJwkSet(signatureJWKSet);
  674.         bean.setUser(aliasSignatureUser);
  675.         bean.setPassword(aliasSignaturePassword);
  676.         bean.setMultiKeystore(multiKeystore);
  677.        
  678.         return bean;

  679.     }  
  680.     public static SignatureBean getReceiverSignatureBean(MessageSecurityContext messageSecurityContext, org.openspcoop2.utils.Map<Object> ctx) throws UtilsException, SecurityException, FileNotFoundException, URISyntaxException {

  681.         if(messageSecurityContext.getSignatureBean()!=null) {
  682.             return messageSecurityContext.getSignatureBean();
  683.         }
  684.        
  685.         RequestInfo requestInfo = null;
  686.         if(ctx!=null && ctx.containsKey(Costanti.REQUEST_INFO)) {
  687.             requestInfo = (RequestInfo) ctx.get(Costanti.REQUEST_INFO);
  688.         }
  689.        
  690.         MultiKeystore multiKeystore = null;
  691.         JWKSet signatureJWKSet = null;
  692.         KeyStore signatureKS = null;
  693.         KeyStore signatureTrustStoreKS = null;
  694.         String aliasSignatureUser = null;
  695.         String aliasSignaturePassword = null;
  696.         String crlPath = null;
  697.         // Alias Chiave/Certificato per Signature
  698.         aliasSignatureUser = (String) messageSecurityContext.getIncomingProperties().get(SecurityConstants.SIGNATURE_USER);
  699.         if(aliasSignatureUser==null){
  700.             aliasSignatureUser = (String) messageSecurityContext.getIncomingProperties().get(SecurityConstants.USER);
  701.             if(aliasSignatureUser==null){
  702.                 throw new UtilsException(SecurityConstants.SIGNATURE_USER+"/"+SecurityConstants.USER+SUFFIX_NON_FORNITA);
  703.             }
  704.         }

  705.         // CRL
  706.         crlPath = (String)  messageSecurityContext.getIncomingProperties().get(SecurityConstants.SIGNATURE_CRL);

  707.         // 0.a TrustStore
  708.         String signatureTrustStore = (String) messageSecurityContext.getIncomingProperties().get(SecurityConstants.SIGNATURE_TRUSTSTORE_PROPERTY_FILE);
  709.         // 0.b TrustStore as properties
  710.         Object oSignatureTrustStoreProperties = messageSecurityContext.getIncomingProperties().get(SecurityConstants.SIGNATURE_TRUSTSTORE_PROPERTY_REF_ID);
  711.         Properties signatureTrustStoreProperties = null;
  712.         if(oSignatureTrustStoreProperties!=null) {
  713.             signatureTrustStoreProperties = (Properties) oSignatureTrustStoreProperties;
  714.         }
  715.         // 1.a Property Merlin
  716.         String signatureStore = (String) messageSecurityContext.getIncomingProperties().get(SecurityConstants.SIGNATURE_PROPERTY_FILE);
  717.         // 1.b Property Merlin as properties
  718.         Object oSignatureStoreProperties = messageSecurityContext.getIncomingProperties().get(SecurityConstants.SIGNATURE_PROPERTY_REF_ID);
  719.         Properties signatureStoreProperties = null;
  720.         if(oSignatureStoreProperties!=null) {
  721.             signatureStoreProperties = (Properties) oSignatureStoreProperties;
  722.         }
  723.         // 2. Multi Property
  724.         String multiSignatureStore = (String) messageSecurityContext.getIncomingProperties().get(SecurityConstants.SIGNATURE_MULTI_PROPERTY_FILE);
  725.         // 3 JWKSet
  726.         String signatureJWKSetFile = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.SIGNATURE_JWK_SET_FILE);
  727.                
  728.                
  729.         // Istanzione truststore
  730.         // 0. TrustStore
  731.         if(signatureTrustStore!=null){
  732.             MerlinTruststore merlinTruststore = GestoreKeystoreCache.getMerlinTruststore(requestInfo, signatureTrustStore);
  733.             signatureTrustStoreKS = merlinTruststore.getTrustStore();
  734.         }
  735.         else if(signatureTrustStoreProperties!=null) {
  736.             MerlinTruststore merlinTruststore = null;
  737.             String storePath = signatureTrustStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PATH);
  738.             String storeType = signatureTrustStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_TYPE);
  739.             String storePassword = signatureTrustStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PASSWORD);
  740.             if(StringUtils.isNotEmpty(storePath) && StringUtils.isNotEmpty(storeType) && StringUtils.isNotEmpty(storePassword)) {
  741.                 merlinTruststore = GestoreKeystoreCache.getMerlinTruststore(requestInfo, storePath, storeType, storePassword);
  742.             }
  743.             else {
  744.                 merlinTruststore = new MerlinTruststore(signatureTrustStoreProperties);
  745.             }
  746.             signatureTrustStoreKS = merlinTruststore.getTrustStore();
  747.         }

  748.         // Istanzio keystore
  749.         // 1. Property Merlin
  750.         if(signatureStore!=null){
  751.             aliasSignaturePassword = (String) messageSecurityContext.getIncomingProperties().get(SecurityConstants.SIGNATURE_PASSWORD);
  752.             if(aliasSignaturePassword==null){
  753.                 throw new UtilsException(SecurityConstants.SIGNATURE_PASSWORD+SUFFIX_NON_FORNITA);
  754.             }
  755.             MerlinKeystore merlinKeystore = GestoreKeystoreCache.getMerlinKeystore(requestInfo, signatureStore, aliasSignaturePassword);
  756.             signatureKS = merlinKeystore.getKeyStore();
  757.         }
  758.         else if(signatureStoreProperties!=null) {
  759.             MerlinKeystore merlinKeystore = null;
  760.             String storePath = signatureStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PATH);
  761.             String storeType = signatureStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_TYPE);
  762.             String storePassword = signatureStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PASSWORD);

  763.             BYOKRequestParams byokParams = getBYOKRequestParams(requestInfo, signatureStoreProperties);
  764.            
  765.             if(StringUtils.isNotEmpty(storePath) && StringUtils.isNotEmpty(storeType) && StringUtils.isNotEmpty(storePassword)) {
  766.                 merlinKeystore = GestoreKeystoreCache.getMerlinKeystore(requestInfo, storePath, storeType, storePassword, aliasSignaturePassword, byokParams);
  767.             }
  768.             else {
  769.                 merlinKeystore = new MerlinKeystore(signatureStoreProperties, aliasSignaturePassword);
  770.             }
  771.             signatureKS = merlinKeystore.getKeyStore();
  772.         }
  773.         // 2. Multi Property
  774.         else if(multiSignatureStore!=null){
  775.             multiKeystore = GestoreKeystoreCache.getMultiKeystore(requestInfo, multiSignatureStore);
  776.             if(SecurityConstants.MULTI_USER_KEYWORD_FRUITORE.equals(aliasSignatureUser) &&
  777.                     messageSecurityContext.getIdFruitore()!=null && messageSecurityContext.getIdFruitore().getNome()!=null){
  778.                 String fruitore = messageSecurityContext.getIdFruitore().getNome();
  779.                 signatureKS = multiKeystore.getKeyStore(fruitore);
  780.                 aliasSignatureUser = multiKeystore.getKeyAlias(fruitore);
  781.                 aliasSignaturePassword = multiKeystore.getKeyPassword(fruitore);
  782.             }
  783.             else if(SecurityConstants.MULTI_USER_KEYWORD_EROGATORE.equals(aliasSignatureUser) &&
  784.                     messageSecurityContext.getIdServizio()!=null &&
  785.                     messageSecurityContext.getIdServizio().getSoggettoErogatore()!=null &&
  786.                     messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome()!=null){
  787.                 String erogatore = messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome();
  788.                 signatureKS = multiKeystore.getKeyStore(erogatore);
  789.                 aliasSignatureUser = multiKeystore.getKeyAlias(erogatore);
  790.                 aliasSignaturePassword = multiKeystore.getKeyPassword(erogatore);
  791.             }
  792.             else if(SecurityConstants.MULTI_USER_KEYWORD_FRUITORE_EROGATORE.equals(aliasSignatureUser) &&
  793.                     messageSecurityContext.getIdFruitore()!=null && messageSecurityContext.getIdFruitore().getNome()!=null &&
  794.                     messageSecurityContext.getIdServizio()!=null &&
  795.                     messageSecurityContext.getIdServizio().getSoggettoErogatore()!=null &&
  796.                     messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome()!=null){
  797.                 String fruitore = messageSecurityContext.getIdFruitore().getNome();
  798.                 String erogatore = messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome();
  799.                 String aliasFruitoreErogatore = fruitore+"-"+erogatore;
  800.                 String aliasErogatoreFruitore = erogatore+"-"+fruitore;
  801.                 if(multiKeystore.existsAlias(aliasFruitoreErogatore)){
  802.                     signatureKS = multiKeystore.getKeyStore(aliasFruitoreErogatore);
  803.                     aliasSignatureUser = multiKeystore.getKeyAlias(aliasFruitoreErogatore);
  804.                     aliasSignaturePassword = multiKeystore.getKeyPassword(aliasFruitoreErogatore);
  805.                 }
  806.                 else if(multiKeystore.existsAlias(aliasErogatoreFruitore)){
  807.                     signatureKS = multiKeystore.getKeyStore(aliasErogatoreFruitore);
  808.                     aliasSignatureUser = multiKeystore.getKeyAlias(aliasErogatoreFruitore);
  809.                     aliasSignaturePassword = multiKeystore.getKeyPassword(aliasErogatoreFruitore);
  810.                 }
  811.                 else{
  812.                     throw new UtilsException(PREFIX_ALIAS+"["+aliasFruitoreErogatore+"] o ["+aliasErogatoreFruitore+"]"+SUFFIX_NON_TROVATO_MULTIKEYSTORE);
  813.                 }
  814.             }
  815.             else if(SecurityConstants.MULTI_USER_KEYWORD_PORTA_DOMINIO_FRUITORE.equals(aliasSignatureUser) &&
  816.                     messageSecurityContext.getPddFruitore()!=null){
  817.                 String fruitore = messageSecurityContext.getPddFruitore();
  818.                 signatureKS = multiKeystore.getKeyStore(fruitore);
  819.                 aliasSignatureUser = multiKeystore.getKeyAlias(fruitore);
  820.                 aliasSignaturePassword = multiKeystore.getKeyPassword(fruitore);
  821.             }
  822.             else if(SecurityConstants.MULTI_USER_KEYWORD_PORTA_DOMINIO_EROGATORE.equals(aliasSignatureUser) &&
  823.                     messageSecurityContext.getPddErogatore()!=null){
  824.                 String erogatore = messageSecurityContext.getPddErogatore();
  825.                 signatureKS = multiKeystore.getKeyStore(erogatore);
  826.                 aliasSignatureUser = multiKeystore.getKeyAlias(erogatore);
  827.                 aliasSignaturePassword = multiKeystore.getKeyPassword(erogatore);
  828.             }
  829.             else if(SecurityConstants.MULTI_USER_KEYWORD_IDENTIFICATIVO_PORTA_FRUITORE.equals(aliasSignatureUser) &&
  830.                     messageSecurityContext.getIdFruitore()!=null && messageSecurityContext.getIdFruitore().getCodicePorta()!=null){
  831.                 String fruitore = messageSecurityContext.getIdFruitore().getCodicePorta();
  832.                 signatureKS = multiKeystore.getKeyStore(fruitore);
  833.                 aliasSignatureUser = multiKeystore.getKeyAlias(fruitore);
  834.                 aliasSignaturePassword = multiKeystore.getKeyPassword(fruitore);
  835.             }
  836.             else if(SecurityConstants.MULTI_USER_KEYWORD_IDENTIFICATIVO_PORTA_EROGATORE.equals(aliasSignatureUser) &&
  837.                     messageSecurityContext.getIdServizio()!=null &&
  838.                     messageSecurityContext.getIdServizio().getSoggettoErogatore()!=null &&
  839.                     messageSecurityContext.getIdServizio().getSoggettoErogatore().getCodicePorta()!=null){
  840.                 String erogatore = messageSecurityContext.getIdServizio().getSoggettoErogatore().getCodicePorta();
  841.                 signatureKS = multiKeystore.getKeyStore(erogatore);
  842.                 aliasSignatureUser = multiKeystore.getKeyAlias(erogatore);
  843.                 aliasSignaturePassword = multiKeystore.getKeyPassword(erogatore);
  844.             }
  845.             else{
  846.                 signatureKS = multiKeystore.getKeyStore(aliasSignatureUser);
  847.                 aliasSignaturePassword = multiKeystore.getKeyPassword(aliasSignatureUser);
  848.                 aliasSignatureUser = multiKeystore.getKeyAlias(aliasSignatureUser); // aggiorno con identita alias del keystore
  849.             }
  850.         }
  851.        
  852.         // Istanzio JWKSet
  853.         if(signatureJWKSetFile!=null) {
  854.             signatureJWKSet = new JWKSet(new String(readResources(signatureJWKSetFile)));
  855.         }
  856.                

  857.         if(signatureKS==null && signatureTrustStoreKS==null && signatureJWKSet==null) {
  858.             throw new UtilsException("Nessuna modalita' di recupero del TrustStore per la funzionalita' di Signature indicata");
  859.         }
  860.        
  861.         SignatureBean bean = new SignatureBean();
  862.         bean.setKeystore(signatureKS);
  863.         bean.setTruststore(signatureTrustStoreKS);
  864.         bean.setJwkSet(signatureJWKSet);
  865.         bean.setUser(aliasSignatureUser);
  866.         bean.setPassword(aliasSignaturePassword);
  867.         bean.setCrlPath(crlPath);
  868.         bean.setMultiKeystore(multiKeystore);
  869.        
  870.         return bean;

  871.     }
  872.    
  873.    
  874.     private static byte[] readResources(String path) throws UtilsException, FileNotFoundException, URISyntaxException {
  875.         byte [] b = null;
  876.         if(path==null) {
  877.             return b;
  878.         }
  879.         if(path.startsWith("http") || path.startsWith("https")) {
  880.             HttpResponse httpResponse = HttpUtilities.getHTTPResponse(path, 60000, 10000);
  881.             if(httpResponse==null || httpResponse.getContent()==null) {
  882.                 throw new UtilsException("Resource '"+path+"' unavailable");
  883.             }
  884.             if(httpResponse.getResultHTTPOperation()!=200) {
  885.                 throw new UtilsException("Retrieve resource '"+path+"' failed (returnCode:"+httpResponse.getResultHTTPOperation()+")");
  886.             }
  887.             return httpResponse.getContent();
  888.         }
  889.         else if(path.startsWith("file")){
  890.             File f = new File(new URI(path));
  891.             return FileSystemUtilities.readBytesFromFile(f);
  892.         }
  893.         else {
  894.             File f = new File(path);
  895.             if(!f.exists()) {
  896.                 throw new UtilsException("File '"+f.getAbsolutePath()+"' not exists");
  897.             }
  898.             return FileSystemUtilities.readBytesFromFile(f);
  899.         }
  900.     }
  901.    
  902.     private static BYOKRequestParams getBYOKRequestParams(RequestInfo requestInfo, Properties properties) throws UtilsException{
  903.         String keyStoreByokPolicy = properties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PATH_BYOK);
  904.         BYOKRequestParams byokParams = null;
  905.         if (keyStoreByokPolicy != null) {
  906.             keyStoreByokPolicy = keyStoreByokPolicy.trim();
  907.             if(BYOKProvider.isPolicyDefined(keyStoreByokPolicy)){
  908.                 try {
  909.                     byokParams = BYOKProvider.getBYOKRequestParamsByUnwrapBYOKPolicy(keyStoreByokPolicy,
  910.                             requestInfo!=null && requestInfo.getDynamicMap()!=null ? requestInfo.getDynamicMap() : new HashMap<>() );
  911.                 }catch(Exception e) {
  912.                     throw new UtilsException(e.getMessage(),e);
  913.                 }
  914.             }
  915.         }
  916.         return byokParams;
  917.     }
  918. }