KeystoreUtils.java
/*
* GovWay - A customizable API Gateway
* https://govway.org
*
* Copyright (c) 2005-2024 Link.it srl (https://link.it).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3, as published by
* the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openspcoop2.security.message.utils;
import java.io.File;
import java.io.FileNotFoundException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Properties;
import org.apache.commons.lang.StringUtils;
import org.openspcoop2.core.constants.Costanti;
import org.openspcoop2.protocol.sdk.state.RequestInfo;
import org.openspcoop2.security.SecurityException;
import org.openspcoop2.security.keystore.KeystoreConstants;
import org.openspcoop2.security.keystore.MerlinKeystore;
import org.openspcoop2.security.keystore.MerlinTruststore;
import org.openspcoop2.security.keystore.MultiKeystore;
import org.openspcoop2.security.keystore.SymmetricKeystore;
import org.openspcoop2.security.keystore.cache.GestoreKeystoreCache;
import org.openspcoop2.security.message.MessageSecurityContext;
import org.openspcoop2.security.message.constants.SecurityConstants;
import org.openspcoop2.utils.UtilsException;
import org.openspcoop2.utils.certificate.JWKSet;
import org.openspcoop2.utils.certificate.KeyStore;
import org.openspcoop2.utils.certificate.byok.BYOKProvider;
import org.openspcoop2.utils.certificate.byok.BYOKRequestParams;
import org.openspcoop2.utils.resources.FileSystemUtilities;
import org.openspcoop2.utils.transport.http.HttpResponse;
import org.openspcoop2.utils.transport.http.HttpUtilities;
/**
* KeystoreUtils
*
* @author Andrea Poli (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class KeystoreUtils {
private KeystoreUtils() {}
private static final String PREFIX_ALIAS = "Alias ";
private static final String SUFFIX_NON_FORNITA = " non fornita";
private static final String SUFFIX_NON_TROVATO_MULTIKEYSTORE = " non trovato nella configurazione MultiKeystore";
public static EncryptionBean getSenderEncryptionBean(MessageSecurityContext messageSecurityContext, org.openspcoop2.utils.Map<Object> ctx) throws UtilsException, SecurityException, FileNotFoundException, URISyntaxException {
if(messageSecurityContext.getEncryptionBean()!=null) {
return messageSecurityContext.getEncryptionBean();
}
RequestInfo requestInfo = null;
if(ctx!=null && ctx.containsKey(Costanti.REQUEST_INFO)) {
requestInfo = (RequestInfo) ctx.get(Costanti.REQUEST_INFO);
}
MultiKeystore multiKeystore = null;
JWKSet encryptionJWKSet = null;
KeyStore encryptionKS = null;
KeyStore encryptionTrustStoreKS = null;
boolean encryptionSymmetric = false;
String aliasEncryptUser = null;
String aliasEncryptPassword = null;
// Alias Chiave/Certificato per Encrypt
aliasEncryptUser = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.ENCRYPTION_USER);
if(aliasEncryptUser==null){
aliasEncryptUser = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.USER);
if(aliasEncryptUser==null){
throw new UtilsException(SecurityConstants.ENCRYPTION_USER+"/"+SecurityConstants.USER+SUFFIX_NON_FORNITA);
}
}
// Leggo Modalita' di encrypt (Symmetric/Asymmetric)
Object encryptionSymmetricObject = messageSecurityContext.getOutgoingProperties().get(SecurityConstants.ENCRYPTION_SYMMETRIC);
if(encryptionSymmetricObject!=null){
encryptionSymmetric = SecurityConstants.TRUE.equals(encryptionSymmetricObject);
}
// 0.a TrustStore
String encryptionTrustStore = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.ENCRYPTION_TRUSTSTORE_PROPERTY_FILE);
// 0.b TrustStore as properties
Object oEncryptionTrustStoreProperties = messageSecurityContext.getOutgoingProperties().get(SecurityConstants.ENCRYPTION_TRUSTSTORE_PROPERTY_REF_ID);
Properties encryptionTrustStoreProperties = null;
if(oEncryptionTrustStoreProperties!=null) {
encryptionTrustStoreProperties = (Properties) oEncryptionTrustStoreProperties;
}
// 1.a Property Merlin
String encryptionStore = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.ENCRYPTION_PROPERTY_FILE);
// 1.b Property Merlin as properties
Object oEncryptionStoreProperties = messageSecurityContext.getOutgoingProperties().get(SecurityConstants.ENCRYPTION_PROPERTY_REF_ID);
Properties encryptionStoreProperties = null;
if(oEncryptionStoreProperties!=null) {
encryptionStoreProperties = (Properties) oEncryptionStoreProperties;
}
// 2. Multi Property
String multiEncryptionStore = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.ENCRYPTION_MULTI_PROPERTY_FILE);
// 3. In caso di chiave simmetrica provo a vedere se e' stata fornita direttamente una chiave
String encryptionSymmetricKeyValue = null;
if(encryptionSymmetric){
encryptionSymmetricKeyValue = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.ENCRYPTION_SYMMETRIC_KEY_VALUE);
}
// 4 JWKSet
String encryptionJWKSetFile = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.ENCRYPTION_JWK_SET_FILE);
// Istanzione truststore
// 0. TrustStore
if(encryptionTrustStore!=null){
MerlinTruststore merlinTruststore = GestoreKeystoreCache.getMerlinTruststore(requestInfo, encryptionTrustStore);
encryptionTrustStoreKS = merlinTruststore.getTrustStore();
}
else if(encryptionTrustStoreProperties!=null){
MerlinTruststore merlinTruststore = null;
String storePath = encryptionTrustStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PATH);
String storeType = encryptionTrustStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_TYPE);
String storePassword = encryptionTrustStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PASSWORD);
if(StringUtils.isNotEmpty(storePath) && StringUtils.isNotEmpty(storeType) && StringUtils.isNotEmpty(storePassword)) {
merlinTruststore = GestoreKeystoreCache.getMerlinTruststore(requestInfo, storePath, storeType, storePassword);
}
else {
merlinTruststore = new MerlinTruststore(encryptionTrustStoreProperties);
}
encryptionTrustStoreKS = merlinTruststore.getTrustStore();
}
// Istanzio keystore
// 1. Property Merlin
if(encryptionStore!=null || encryptionStoreProperties!=null){
aliasEncryptPassword = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.ENCRYPTION_PASSWORD);
if(aliasEncryptPassword==null){
throw new UtilsException(SecurityConstants.ENCRYPTION_PASSWORD+SUFFIX_NON_FORNITA);
}
}
if(encryptionStore!=null){
MerlinKeystore merlinKeystore = GestoreKeystoreCache.getMerlinKeystore(requestInfo, encryptionStore, aliasEncryptPassword);
encryptionKS = merlinKeystore.getKeyStore();
}
else if(encryptionStoreProperties!=null){
MerlinKeystore merlinKeystore = null;
String storePath = encryptionStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PATH);
String storeType = encryptionStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_TYPE);
String storePassword = encryptionStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PASSWORD);
BYOKRequestParams byokParams = getBYOKRequestParams(requestInfo, encryptionStoreProperties);
if(StringUtils.isNotEmpty(storePath) && StringUtils.isNotEmpty(storeType) && StringUtils.isNotEmpty(storePassword)) {
merlinKeystore = GestoreKeystoreCache.getMerlinKeystore(requestInfo, storePath, storeType, storePassword, aliasEncryptPassword, byokParams);
}
else {
merlinKeystore = new MerlinKeystore(encryptionStoreProperties, aliasEncryptPassword);
}
encryptionKS = merlinKeystore.getKeyStore();
}
// 2. Multi Property
else if(multiEncryptionStore!=null){
multiKeystore = GestoreKeystoreCache.getMultiKeystore(requestInfo, multiEncryptionStore);
if(SecurityConstants.MULTI_USER_KEYWORD_FRUITORE.equals(aliasEncryptUser) &&
messageSecurityContext.getIdFruitore()!=null && messageSecurityContext.getIdFruitore().getNome()!=null){
String fruitore = messageSecurityContext.getIdFruitore().getNome();
encryptionKS = multiKeystore.getKeyStore(fruitore);
aliasEncryptUser = multiKeystore.getKeyAlias(fruitore);
aliasEncryptPassword = multiKeystore.getKeyPassword(fruitore);
}
else if(SecurityConstants.MULTI_USER_KEYWORD_EROGATORE.equals(aliasEncryptUser) &&
messageSecurityContext.getIdServizio()!=null &&
messageSecurityContext.getIdServizio().getSoggettoErogatore()!=null &&
messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome()!=null){
String erogatore = messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome();
encryptionKS = multiKeystore.getKeyStore(erogatore);
aliasEncryptUser = multiKeystore.getKeyAlias(erogatore);
aliasEncryptPassword = multiKeystore.getKeyPassword(erogatore);
}
else if(SecurityConstants.MULTI_USER_KEYWORD_FRUITORE_EROGATORE.equals(aliasEncryptUser) &&
messageSecurityContext.getIdFruitore()!=null && messageSecurityContext.getIdFruitore().getNome()!=null &&
messageSecurityContext.getIdServizio()!=null &&
messageSecurityContext.getIdServizio().getSoggettoErogatore()!=null &&
messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome()!=null){
String fruitore = messageSecurityContext.getIdFruitore().getNome();
String erogatore = messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome();
String aliasFruitoreErogatore = fruitore+"-"+erogatore;
String aliasErogatoreFruitore = erogatore+"-"+fruitore;
if(multiKeystore.existsAlias(aliasFruitoreErogatore)){
encryptionKS = multiKeystore.getKeyStore(aliasFruitoreErogatore);
aliasEncryptUser = multiKeystore.getKeyAlias(aliasFruitoreErogatore);
aliasEncryptPassword = multiKeystore.getKeyPassword(aliasFruitoreErogatore);
}
else if(multiKeystore.existsAlias(aliasErogatoreFruitore)){
encryptionKS = multiKeystore.getKeyStore(aliasErogatoreFruitore);
aliasEncryptUser = multiKeystore.getKeyAlias(aliasErogatoreFruitore);
aliasEncryptPassword = multiKeystore.getKeyPassword(aliasErogatoreFruitore);
}
else{
throw new UtilsException(PREFIX_ALIAS+"["+aliasFruitoreErogatore+"]"+" o "+"["+aliasErogatoreFruitore+"]"+SUFFIX_NON_TROVATO_MULTIKEYSTORE);
}
}
else if(SecurityConstants.MULTI_USER_KEYWORD_PORTA_DOMINIO_FRUITORE.equals(aliasEncryptUser) &&
messageSecurityContext.getPddFruitore()!=null){
String fruitore = messageSecurityContext.getPddFruitore();
encryptionKS = multiKeystore.getKeyStore(fruitore);
aliasEncryptUser = multiKeystore.getKeyAlias(fruitore);
aliasEncryptPassword = multiKeystore.getKeyPassword(fruitore);
}
else if(SecurityConstants.MULTI_USER_KEYWORD_PORTA_DOMINIO_EROGATORE.equals(aliasEncryptUser) &&
messageSecurityContext.getPddErogatore()!=null){
String erogatore = messageSecurityContext.getPddErogatore();
encryptionKS = multiKeystore.getKeyStore(erogatore);
aliasEncryptUser = multiKeystore.getKeyAlias(erogatore);
aliasEncryptPassword = multiKeystore.getKeyPassword(erogatore);
}
else if(SecurityConstants.MULTI_USER_KEYWORD_IDENTIFICATIVO_PORTA_FRUITORE.equals(aliasEncryptUser) &&
messageSecurityContext.getIdFruitore()!=null && messageSecurityContext.getIdFruitore().getCodicePorta()!=null){
String fruitore = messageSecurityContext.getIdFruitore().getCodicePorta();
encryptionKS = multiKeystore.getKeyStore(fruitore);
aliasEncryptUser = multiKeystore.getKeyAlias(fruitore);
aliasEncryptPassword = multiKeystore.getKeyPassword(fruitore);
}
else if(SecurityConstants.MULTI_USER_KEYWORD_IDENTIFICATIVO_PORTA_EROGATORE.equals(aliasEncryptUser) &&
messageSecurityContext.getIdServizio()!=null &&
messageSecurityContext.getIdServizio().getSoggettoErogatore()!=null &&
messageSecurityContext.getIdServizio().getSoggettoErogatore().getCodicePorta()!=null){
String erogatore = messageSecurityContext.getIdServizio().getSoggettoErogatore().getCodicePorta();
encryptionKS = multiKeystore.getKeyStore(erogatore);
aliasEncryptUser = multiKeystore.getKeyAlias(erogatore);
aliasEncryptPassword = multiKeystore.getKeyPassword(erogatore);
}
else{
encryptionKS = multiKeystore.getKeyStore(aliasEncryptUser);
aliasEncryptPassword = multiKeystore.getKeyPassword(aliasEncryptUser);
aliasEncryptUser = multiKeystore.getKeyAlias(aliasEncryptUser); // aggiorno con identita alias del keystore
}
}
// 3. In caso di chiave simmetrica provo a vedere se e' stata fornita direttamente una chiave
else if(encryptionSymmetricKeyValue!=null){
Object encryptionSymmetricAlgoritm = messageSecurityContext.getOutgoingProperties().get(SecurityConstants.ENCRYPTION_SYMMETRIC_ALGORITHM);
if(encryptionSymmetricAlgoritm==null){
throw new UtilsException("E' stata indicata una funzionalita' di encrypt con chiave simmetrica fornita direttamente nelle proprieta' ["+
SecurityConstants.ENCRYPTION_SYMMETRIC_KEY_VALUE+"="+encryptionSymmetricKeyValue+"], ma non e' stato indicato l'algoritmo associato tramite la proprieta' "+
SecurityConstants.ENCRYPTION_SYMMETRIC_ALGORITHM);
}
SymmetricKeystore symmetricKeystore = GestoreKeystoreCache.getSymmetricKeystore(requestInfo, aliasEncryptUser, encryptionSymmetricKeyValue, (String)encryptionSymmetricAlgoritm);
encryptionKS = symmetricKeystore.getKeyStore();
aliasEncryptPassword = symmetricKeystore.getPasswordKey();
}
// Istanzio JWKSet
if(encryptionJWKSetFile!=null) {
encryptionJWKSet = new JWKSet(new String(readResources(encryptionJWKSetFile)));
}
if(encryptionKS==null && encryptionTrustStoreKS==null && encryptionJWKSet==null) {
throw new UtilsException("Nessuna modalita' di recupero del Keystore per la funzionalita' di Encryption indicata");
}
EncryptionBean bean = new EncryptionBean();
bean.setKeystore(encryptionKS);
bean.setTruststore(encryptionTrustStoreKS);
bean.setJwkSet(encryptionJWKSet);
bean.setUser(aliasEncryptUser);
bean.setPassword(aliasEncryptPassword);
bean.setEncryptionSimmetric(encryptionSymmetric);
bean.setMultiKeystore(multiKeystore);
return bean;
}
public static EncryptionBean getReceiverEncryptionBean(MessageSecurityContext messageSecurityContext, org.openspcoop2.utils.Map<Object> ctx) throws UtilsException, SecurityException, FileNotFoundException, URISyntaxException {
if(messageSecurityContext.getEncryptionBean()!=null) {
return messageSecurityContext.getEncryptionBean();
}
RequestInfo requestInfo = null;
if(ctx!=null && ctx.containsKey(Costanti.REQUEST_INFO)) {
requestInfo = (RequestInfo) ctx.get(Costanti.REQUEST_INFO);
}
MultiKeystore multiKeystore = null;
JWKSet decryptionJWKSet = null;
KeyStore decryptionKS = null;
KeyStore decryptionTrustStoreKS = null;
String aliasDecryptUser = null;
String aliasDecryptPassword = null;
boolean decryptionSymmetric = false;
// Alias Chiave/Certificato per Encrypt
aliasDecryptUser = (String) messageSecurityContext.getIncomingProperties().get(SecurityConstants.DECRYPTION_USER);
if(aliasDecryptUser==null){
aliasDecryptUser = (String) messageSecurityContext.getIncomingProperties().get(SecurityConstants.USER);
if(aliasDecryptUser==null){
throw new UtilsException(SecurityConstants.DECRYPTION_USER+"/"+SecurityConstants.USER+SUFFIX_NON_FORNITA);
}
}
// Leggo Modalita' di encrypt (Symmetric/Asymmetric)
Object decryptionSymmetricObject = messageSecurityContext.getIncomingProperties().get(SecurityConstants.DECRYPTION_SYMMETRIC);
if(decryptionSymmetricObject!=null){
decryptionSymmetric = SecurityConstants.TRUE.equals(decryptionSymmetricObject);
}
// 0.a TrustStore
String decryptionTrustStore = (String) messageSecurityContext.getIncomingProperties().get(SecurityConstants.DECRYPTION_TRUSTSTORE_PROPERTY_FILE);
// 0.b TrustStore as properties
Object oDecryptionTrustStoreProperties = messageSecurityContext.getIncomingProperties().get(SecurityConstants.DECRYPTION_TRUSTSTORE_PROPERTY_REF_ID);
Properties decryptionTrustStoreProperties = null;
if(oDecryptionTrustStoreProperties!=null) {
decryptionTrustStoreProperties = (Properties) oDecryptionTrustStoreProperties;
}
// 1.a Property Merlin
String decryptionStore = (String) messageSecurityContext.getIncomingProperties().get(SecurityConstants.DECRYPTION_PROPERTY_FILE);
// 1.b Property Merlin as properties
Object oDecryptionStoreProperties = messageSecurityContext.getIncomingProperties().get(SecurityConstants.DECRYPTION_PROPERTY_REF_ID);
Properties decryptionStoreProperties = null;
if(oDecryptionStoreProperties!=null) {
decryptionStoreProperties = (Properties) oDecryptionStoreProperties;
}
// 2. Multi Property
String multiDecryptionStore = (String) messageSecurityContext.getIncomingProperties().get(SecurityConstants.DECRYPTION_MULTI_PROPERTY_FILE);
// 3. In caso di chiave simmetrica provo a vedere se e' stata fornita direttamente una chiave
String decryptionSymmetricKeyValue = null;
if(decryptionSymmetric){
decryptionSymmetricKeyValue = (String) messageSecurityContext.getIncomingProperties().get(SecurityConstants.DECRYPTION_SYMMETRIC_KEY_VALUE);
}
// 4 JWKSet
String decryptionJWKSetFile = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.DECRYPTION_JWK_SET_FILE);
// Istanzione truststore
// 0. TrustStore
if(decryptionTrustStore!=null){
MerlinTruststore merlinTruststore = GestoreKeystoreCache.getMerlinTruststore(requestInfo, decryptionTrustStore);
decryptionTrustStoreKS = merlinTruststore.getTrustStore();
}
else if(decryptionTrustStoreProperties!=null){
MerlinTruststore merlinTruststore = null;
String storePath = decryptionTrustStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PATH);
String storeType = decryptionTrustStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_TYPE);
String storePassword = decryptionTrustStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PASSWORD);
if(StringUtils.isNotEmpty(storePath) && StringUtils.isNotEmpty(storeType) && StringUtils.isNotEmpty(storePassword)) {
merlinTruststore = GestoreKeystoreCache.getMerlinTruststore(requestInfo, storePath, storeType, storePassword);
}
else {
merlinTruststore = new MerlinTruststore(decryptionTrustStoreProperties);
}
decryptionTrustStoreKS = merlinTruststore.getTrustStore();
}
// Istanzio keystore
// 1. Property Merlin
if(decryptionStore!=null || decryptionStoreProperties!=null){
aliasDecryptPassword = (String) messageSecurityContext.getIncomingProperties().get(SecurityConstants.DECRYPTION_PASSWORD);
if(aliasDecryptPassword==null){
throw new UtilsException(SecurityConstants.DECRYPTION_PASSWORD+SUFFIX_NON_FORNITA);
}
}
if(decryptionStore!=null){
MerlinKeystore merlinKeystore = GestoreKeystoreCache.getMerlinKeystore(requestInfo, decryptionStore, aliasDecryptPassword);
decryptionKS = merlinKeystore.getKeyStore();
}
else if(decryptionStoreProperties!=null){
MerlinKeystore merlinKeystore = null;
String storePath = decryptionStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PATH);
String storeType = decryptionStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_TYPE);
String storePassword = decryptionStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PASSWORD);
BYOKRequestParams byokParams = getBYOKRequestParams(requestInfo, decryptionStoreProperties);
if(StringUtils.isNotEmpty(storePath) && StringUtils.isNotEmpty(storeType) && StringUtils.isNotEmpty(storePassword)) {
merlinKeystore = GestoreKeystoreCache.getMerlinKeystore(requestInfo, storePath, storeType, storePassword, aliasDecryptPassword, byokParams);
}
else {
merlinKeystore = new MerlinKeystore(decryptionStoreProperties, aliasDecryptPassword);
}
decryptionKS = merlinKeystore.getKeyStore();
}
// 2. Multi Property
else if(multiDecryptionStore!=null){
multiKeystore = GestoreKeystoreCache.getMultiKeystore(requestInfo, multiDecryptionStore);
if(SecurityConstants.MULTI_USER_KEYWORD_FRUITORE.equals(aliasDecryptUser) &&
messageSecurityContext.getIdFruitore()!=null && messageSecurityContext.getIdFruitore().getNome()!=null){
String fruitore = messageSecurityContext.getIdFruitore().getNome();
decryptionKS = multiKeystore.getKeyStore(fruitore);
aliasDecryptUser = multiKeystore.getKeyAlias(fruitore);
aliasDecryptPassword = multiKeystore.getKeyPassword(fruitore);
}
else if(SecurityConstants.MULTI_USER_KEYWORD_EROGATORE.equals(aliasDecryptUser) &&
messageSecurityContext.getIdServizio()!=null &&
messageSecurityContext.getIdServizio().getSoggettoErogatore()!=null &&
messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome()!=null){
String erogatore = messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome();
decryptionKS = multiKeystore.getKeyStore(erogatore);
aliasDecryptUser = multiKeystore.getKeyAlias(erogatore);
aliasDecryptPassword = multiKeystore.getKeyPassword(erogatore);
}
else if(SecurityConstants.MULTI_USER_KEYWORD_FRUITORE_EROGATORE.equals(aliasDecryptUser) &&
messageSecurityContext.getIdFruitore()!=null && messageSecurityContext.getIdFruitore().getNome()!=null &&
messageSecurityContext.getIdServizio()!=null &&
messageSecurityContext.getIdServizio().getSoggettoErogatore()!=null &&
messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome()!=null){
String fruitore = messageSecurityContext.getIdFruitore().getNome();
String erogatore = messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome();
String aliasFruitoreErogatore = fruitore+"-"+erogatore;
String aliasErogatoreFruitore = erogatore+"-"+fruitore;
if(multiKeystore.existsAlias(aliasFruitoreErogatore)){
decryptionKS = multiKeystore.getKeyStore(aliasFruitoreErogatore);
aliasDecryptUser = multiKeystore.getKeyAlias(aliasFruitoreErogatore);
aliasDecryptPassword = multiKeystore.getKeyPassword(aliasFruitoreErogatore);
}
else if(multiKeystore.existsAlias(aliasErogatoreFruitore)){
decryptionKS = multiKeystore.getKeyStore(aliasErogatoreFruitore);
aliasDecryptUser = multiKeystore.getKeyAlias(aliasErogatoreFruitore);
aliasDecryptPassword = multiKeystore.getKeyPassword(aliasErogatoreFruitore);
}
else{
throw new UtilsException(PREFIX_ALIAS+"["+aliasFruitoreErogatore+"] o ["+aliasErogatoreFruitore+"]"+SUFFIX_NON_TROVATO_MULTIKEYSTORE);
}
}
else if(SecurityConstants.MULTI_USER_KEYWORD_PORTA_DOMINIO_FRUITORE.equals(aliasDecryptUser) &&
messageSecurityContext.getPddFruitore()!=null){
String fruitore = messageSecurityContext.getPddFruitore();
decryptionKS = multiKeystore.getKeyStore(fruitore);
aliasDecryptUser = multiKeystore.getKeyAlias(fruitore);
aliasDecryptPassword = multiKeystore.getKeyPassword(fruitore);
}
else if(SecurityConstants.MULTI_USER_KEYWORD_PORTA_DOMINIO_EROGATORE.equals(aliasDecryptUser) &&
messageSecurityContext.getPddErogatore()!=null){
String erogatore = messageSecurityContext.getPddErogatore();
decryptionKS = multiKeystore.getKeyStore(erogatore);
aliasDecryptUser = multiKeystore.getKeyAlias(erogatore);
aliasDecryptPassword = multiKeystore.getKeyPassword(erogatore);
}
else if(SecurityConstants.MULTI_USER_KEYWORD_IDENTIFICATIVO_PORTA_FRUITORE.equals(aliasDecryptUser) &&
messageSecurityContext.getIdFruitore()!=null && messageSecurityContext.getIdFruitore().getCodicePorta()!=null){
String fruitore = messageSecurityContext.getIdFruitore().getCodicePorta();
decryptionKS = multiKeystore.getKeyStore(fruitore);
aliasDecryptUser = multiKeystore.getKeyAlias(fruitore);
aliasDecryptPassword = multiKeystore.getKeyPassword(fruitore);
}
else if(SecurityConstants.MULTI_USER_KEYWORD_IDENTIFICATIVO_PORTA_EROGATORE.equals(aliasDecryptUser) &&
messageSecurityContext.getIdServizio()!=null &&
messageSecurityContext.getIdServizio().getSoggettoErogatore()!=null &&
messageSecurityContext.getIdServizio().getSoggettoErogatore().getCodicePorta()!=null){
String erogatore = messageSecurityContext.getIdServizio().getSoggettoErogatore().getCodicePorta();
decryptionKS = multiKeystore.getKeyStore(erogatore);
aliasDecryptUser = multiKeystore.getKeyAlias(erogatore);
aliasDecryptPassword = multiKeystore.getKeyPassword(erogatore);
}
else{
decryptionKS = multiKeystore.getKeyStore(aliasDecryptUser);
aliasDecryptPassword = multiKeystore.getKeyPassword(aliasDecryptUser);
aliasDecryptUser = multiKeystore.getKeyAlias(aliasDecryptUser); // aggiorno con identita alias del keystore
}
}
// 3. In caso di chiave simmetrica provo a vedere se e' stata fornita direttamente una chiave
else if(decryptionSymmetricKeyValue!=null){
Object decryptionSymmetricAlgoritm = messageSecurityContext.getIncomingProperties().get(SecurityConstants.DECRYPTION_SYMMETRIC_ALGORITHM);
if(decryptionSymmetricAlgoritm==null){
throw new UtilsException("E' stata indicata una funzionalita' di encrypt con chiave simmetrica fornita direttamente nelle proprieta' ["+
SecurityConstants.DECRYPTION_SYMMETRIC_KEY_VALUE+"="+decryptionSymmetricKeyValue+"], ma non e' stato indicato l'algoritmo associato tramite la proprieta' "+
SecurityConstants.DECRYPTION_SYMMETRIC_ALGORITHM);
}
SymmetricKeystore symmetricKeystore = GestoreKeystoreCache.getSymmetricKeystore(requestInfo, aliasDecryptUser, decryptionSymmetricKeyValue, (String)decryptionSymmetricAlgoritm);
decryptionKS = symmetricKeystore.getKeyStore();
aliasDecryptPassword = symmetricKeystore.getPasswordKey();
}
// 4. Provo a vedere se è stato fornito un JWKSet
else if(decryptionJWKSetFile!=null) {
decryptionJWKSet = new JWKSet(new String(readResources(decryptionJWKSetFile)));
}
else{
throw new UtilsException("Nessuna modalita' di recupero del Keystore per la funzionalita' di Encryption indicata");
}
EncryptionBean bean = new EncryptionBean();
bean.setKeystore(decryptionKS);
bean.setTruststore(decryptionTrustStoreKS);
bean.setJwkSet(decryptionJWKSet);
bean.setUser(aliasDecryptUser);
bean.setPassword(aliasDecryptPassword);
bean.setEncryptionSimmetric(decryptionSymmetric);
bean.setMultiKeystore(multiKeystore);
return bean;
}
public static SignatureBean getSenderSignatureBean(MessageSecurityContext messageSecurityContext, org.openspcoop2.utils.Map<Object> ctx) throws UtilsException, SecurityException, FileNotFoundException, URISyntaxException {
if(messageSecurityContext.getSignatureBean()!=null) {
return messageSecurityContext.getSignatureBean();
}
RequestInfo requestInfo = null;
if(ctx!=null && ctx.containsKey(Costanti.REQUEST_INFO)) {
requestInfo = (RequestInfo) ctx.get(Costanti.REQUEST_INFO);
}
MultiKeystore multiKeystore = null;
JWKSet signatureJWKSet = null;
KeyStore signatureKS = null;
KeyStore signatureTrustStoreKS = null;
String aliasSignatureUser = null;
String aliasSignaturePassword = null;
// Alias Chiave/Certificato per Signature
aliasSignatureUser = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.SIGNATURE_USER);
if(aliasSignatureUser==null){
aliasSignatureUser = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.USER);
if(aliasSignatureUser==null){
throw new UtilsException(SecurityConstants.SIGNATURE_USER+"/"+SecurityConstants.USER+SUFFIX_NON_FORNITA);
}
}
// 0.a TrustStore
String signatureTrustStore = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.SIGNATURE_TRUSTSTORE_PROPERTY_FILE);
// 0.b TrustStore as properties
Object oSignatureTrustStoreProperties = messageSecurityContext.getOutgoingProperties().get(SecurityConstants.SIGNATURE_TRUSTSTORE_PROPERTY_REF_ID);
Properties signatureTrustStoreProperties = null;
if(oSignatureTrustStoreProperties!=null) {
signatureTrustStoreProperties = (Properties) oSignatureTrustStoreProperties;
}
// 1.a Property Merlin
String signatureStore = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.SIGNATURE_PROPERTY_FILE);
// 1.b Property Merlin as properties
Object oSignatureStoreProperties = messageSecurityContext.getOutgoingProperties().get(SecurityConstants.SIGNATURE_PROPERTY_REF_ID);
Properties signatureStoreProperties = null;
if(oSignatureStoreProperties!=null) {
signatureStoreProperties = (Properties) oSignatureStoreProperties;
}
// 2. Multi Property
String multiSignatureStore = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.SIGNATURE_MULTI_PROPERTY_FILE);
// 3 JWKSet
String signatureJWKSetFile = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.SIGNATURE_JWK_SET_FILE);
// Istanzione truststore
// 0. TrustStore
if(signatureTrustStore!=null){
MerlinTruststore merlinTruststore = GestoreKeystoreCache.getMerlinTruststore(requestInfo, signatureTrustStore);
signatureTrustStoreKS = merlinTruststore.getTrustStore();
}
else if(signatureTrustStoreProperties!=null) {
MerlinTruststore merlinTruststore = null;
String storePath = signatureTrustStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PATH);
String storeType = signatureTrustStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_TYPE);
String storePassword = signatureTrustStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PASSWORD);
if(StringUtils.isNotEmpty(storePath) && StringUtils.isNotEmpty(storeType) && StringUtils.isNotEmpty(storePassword)) {
merlinTruststore = GestoreKeystoreCache.getMerlinTruststore(requestInfo, storePath, storeType, storePassword);
}
else {
merlinTruststore = new MerlinTruststore(signatureTrustStoreProperties);
}
signatureTrustStoreKS = merlinTruststore.getTrustStore();
}
// Istanzio keystore
// 1. Property Merlin
if(signatureStore!=null || signatureStoreProperties!=null){
aliasSignaturePassword = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.SIGNATURE_PASSWORD);
if(aliasSignaturePassword==null){
throw new UtilsException(SecurityConstants.SIGNATURE_PASSWORD+SUFFIX_NON_FORNITA);
}
}
if(signatureStore!=null){
MerlinKeystore merlinKeystore = GestoreKeystoreCache.getMerlinKeystore(requestInfo, signatureStore, aliasSignaturePassword);
signatureKS = merlinKeystore.getKeyStore();
}
else if(signatureStoreProperties!=null) {
MerlinKeystore merlinKeystore = null;
String storePath = signatureStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PATH);
String storeType = signatureStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_TYPE);
String storePassword = signatureStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PASSWORD);
BYOKRequestParams byokParams = getBYOKRequestParams(requestInfo, signatureStoreProperties);
if(StringUtils.isNotEmpty(storePath) && StringUtils.isNotEmpty(storeType) && StringUtils.isNotEmpty(storePassword)) {
merlinKeystore = GestoreKeystoreCache.getMerlinKeystore(requestInfo, storePath, storeType, storePassword, aliasSignaturePassword, byokParams);
}
else {
merlinKeystore = new MerlinKeystore(signatureStoreProperties, aliasSignaturePassword);
}
signatureKS = merlinKeystore.getKeyStore();
}
// 2. Multi Property
else if(multiSignatureStore!=null){
multiKeystore = GestoreKeystoreCache.getMultiKeystore(requestInfo, multiSignatureStore);
if(SecurityConstants.MULTI_USER_KEYWORD_FRUITORE.equals(aliasSignatureUser) &&
messageSecurityContext.getIdFruitore()!=null && messageSecurityContext.getIdFruitore().getNome()!=null){
String fruitore = messageSecurityContext.getIdFruitore().getNome();
signatureKS = multiKeystore.getKeyStore(fruitore);
aliasSignatureUser = multiKeystore.getKeyAlias(fruitore);
aliasSignaturePassword = multiKeystore.getKeyPassword(fruitore);
}
else if(SecurityConstants.MULTI_USER_KEYWORD_EROGATORE.equals(aliasSignatureUser) &&
messageSecurityContext.getIdServizio()!=null &&
messageSecurityContext.getIdServizio().getSoggettoErogatore()!=null &&
messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome()!=null){
String erogatore = messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome();
signatureKS = multiKeystore.getKeyStore(erogatore);
aliasSignatureUser = multiKeystore.getKeyAlias(erogatore);
aliasSignaturePassword = multiKeystore.getKeyPassword(erogatore);
}
else if(SecurityConstants.MULTI_USER_KEYWORD_FRUITORE_EROGATORE.equals(aliasSignatureUser) &&
messageSecurityContext.getIdFruitore()!=null && messageSecurityContext.getIdFruitore().getNome()!=null &&
messageSecurityContext.getIdServizio()!=null &&
messageSecurityContext.getIdServizio().getSoggettoErogatore()!=null &&
messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome()!=null){
String fruitore = messageSecurityContext.getIdFruitore().getNome();
String erogatore = messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome();
String aliasFruitoreErogatore = fruitore+"-"+erogatore;
String aliasErogatoreFruitore = erogatore+"-"+fruitore;
if(multiKeystore.existsAlias(aliasFruitoreErogatore)){
signatureKS = multiKeystore.getKeyStore(aliasFruitoreErogatore);
aliasSignatureUser = multiKeystore.getKeyAlias(aliasFruitoreErogatore);
aliasSignaturePassword = multiKeystore.getKeyPassword(aliasFruitoreErogatore);
}
else if(multiKeystore.existsAlias(aliasErogatoreFruitore)){
signatureKS = multiKeystore.getKeyStore(aliasErogatoreFruitore);
aliasSignatureUser = multiKeystore.getKeyAlias(aliasErogatoreFruitore);
aliasSignaturePassword = multiKeystore.getKeyPassword(aliasErogatoreFruitore);
}
else{
throw new UtilsException(PREFIX_ALIAS+"["+aliasFruitoreErogatore+"] o ["+aliasErogatoreFruitore+"]"+SUFFIX_NON_TROVATO_MULTIKEYSTORE);
}
}
else if(SecurityConstants.MULTI_USER_KEYWORD_PORTA_DOMINIO_FRUITORE.equals(aliasSignatureUser) &&
messageSecurityContext.getPddFruitore()!=null){
String fruitore = messageSecurityContext.getPddFruitore();
signatureKS = multiKeystore.getKeyStore(fruitore);
aliasSignatureUser = multiKeystore.getKeyAlias(fruitore);
aliasSignaturePassword = multiKeystore.getKeyPassword(fruitore);
}
else if(SecurityConstants.MULTI_USER_KEYWORD_PORTA_DOMINIO_EROGATORE.equals(aliasSignatureUser) &&
messageSecurityContext.getPddErogatore()!=null){
String erogatore = messageSecurityContext.getPddErogatore();
signatureKS = multiKeystore.getKeyStore(erogatore);
aliasSignatureUser = multiKeystore.getKeyAlias(erogatore);
aliasSignaturePassword = multiKeystore.getKeyPassword(erogatore);
}
else if(SecurityConstants.MULTI_USER_KEYWORD_IDENTIFICATIVO_PORTA_FRUITORE.equals(aliasSignatureUser) &&
messageSecurityContext.getIdFruitore()!=null && messageSecurityContext.getIdFruitore().getCodicePorta()!=null){
String fruitore = messageSecurityContext.getIdFruitore().getCodicePorta();
signatureKS = multiKeystore.getKeyStore(fruitore);
aliasSignatureUser = multiKeystore.getKeyAlias(fruitore);
aliasSignaturePassword = multiKeystore.getKeyPassword(fruitore);
}
else if(SecurityConstants.MULTI_USER_KEYWORD_IDENTIFICATIVO_PORTA_EROGATORE.equals(aliasSignatureUser) &&
messageSecurityContext.getIdServizio()!=null &&
messageSecurityContext.getIdServizio().getSoggettoErogatore()!=null &&
messageSecurityContext.getIdServizio().getSoggettoErogatore().getCodicePorta()!=null){
String erogatore = messageSecurityContext.getIdServizio().getSoggettoErogatore().getCodicePorta();
signatureKS = multiKeystore.getKeyStore(erogatore);
aliasSignatureUser = multiKeystore.getKeyAlias(erogatore);
aliasSignaturePassword = multiKeystore.getKeyPassword(erogatore);
}
else{
signatureKS = multiKeystore.getKeyStore(aliasSignatureUser);
aliasSignaturePassword = multiKeystore.getKeyPassword(aliasSignatureUser);
aliasSignatureUser = multiKeystore.getKeyAlias(aliasSignatureUser); // aggiorno con identita alias del keystore
}
}
// 3. Provo a vedere se è stato fornito un JWKSet
else if(signatureJWKSetFile!=null) {
signatureJWKSet = new JWKSet(new String(readResources(signatureJWKSetFile)));
}
else{
throw new UtilsException("Nessuna modalita' di recupero del Keystore per la funzionalita' di Signature indicata");
}
SignatureBean bean = new SignatureBean();
bean.setKeystore(signatureKS);
bean.setTruststore(signatureTrustStoreKS);
bean.setJwkSet(signatureJWKSet);
bean.setUser(aliasSignatureUser);
bean.setPassword(aliasSignaturePassword);
bean.setMultiKeystore(multiKeystore);
return bean;
}
public static SignatureBean getReceiverSignatureBean(MessageSecurityContext messageSecurityContext, org.openspcoop2.utils.Map<Object> ctx) throws UtilsException, SecurityException, FileNotFoundException, URISyntaxException {
if(messageSecurityContext.getSignatureBean()!=null) {
return messageSecurityContext.getSignatureBean();
}
RequestInfo requestInfo = null;
if(ctx!=null && ctx.containsKey(Costanti.REQUEST_INFO)) {
requestInfo = (RequestInfo) ctx.get(Costanti.REQUEST_INFO);
}
MultiKeystore multiKeystore = null;
JWKSet signatureJWKSet = null;
KeyStore signatureKS = null;
KeyStore signatureTrustStoreKS = null;
String aliasSignatureUser = null;
String aliasSignaturePassword = null;
String crlPath = null;
// Alias Chiave/Certificato per Signature
aliasSignatureUser = (String) messageSecurityContext.getIncomingProperties().get(SecurityConstants.SIGNATURE_USER);
if(aliasSignatureUser==null){
aliasSignatureUser = (String) messageSecurityContext.getIncomingProperties().get(SecurityConstants.USER);
if(aliasSignatureUser==null){
throw new UtilsException(SecurityConstants.SIGNATURE_USER+"/"+SecurityConstants.USER+SUFFIX_NON_FORNITA);
}
}
// CRL
crlPath = (String) messageSecurityContext.getIncomingProperties().get(SecurityConstants.SIGNATURE_CRL);
// 0.a TrustStore
String signatureTrustStore = (String) messageSecurityContext.getIncomingProperties().get(SecurityConstants.SIGNATURE_TRUSTSTORE_PROPERTY_FILE);
// 0.b TrustStore as properties
Object oSignatureTrustStoreProperties = messageSecurityContext.getIncomingProperties().get(SecurityConstants.SIGNATURE_TRUSTSTORE_PROPERTY_REF_ID);
Properties signatureTrustStoreProperties = null;
if(oSignatureTrustStoreProperties!=null) {
signatureTrustStoreProperties = (Properties) oSignatureTrustStoreProperties;
}
// 1.a Property Merlin
String signatureStore = (String) messageSecurityContext.getIncomingProperties().get(SecurityConstants.SIGNATURE_PROPERTY_FILE);
// 1.b Property Merlin as properties
Object oSignatureStoreProperties = messageSecurityContext.getIncomingProperties().get(SecurityConstants.SIGNATURE_PROPERTY_REF_ID);
Properties signatureStoreProperties = null;
if(oSignatureStoreProperties!=null) {
signatureStoreProperties = (Properties) oSignatureStoreProperties;
}
// 2. Multi Property
String multiSignatureStore = (String) messageSecurityContext.getIncomingProperties().get(SecurityConstants.SIGNATURE_MULTI_PROPERTY_FILE);
// 3 JWKSet
String signatureJWKSetFile = (String) messageSecurityContext.getOutgoingProperties().get(SecurityConstants.SIGNATURE_JWK_SET_FILE);
// Istanzione truststore
// 0. TrustStore
if(signatureTrustStore!=null){
MerlinTruststore merlinTruststore = GestoreKeystoreCache.getMerlinTruststore(requestInfo, signatureTrustStore);
signatureTrustStoreKS = merlinTruststore.getTrustStore();
}
else if(signatureTrustStoreProperties!=null) {
MerlinTruststore merlinTruststore = null;
String storePath = signatureTrustStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PATH);
String storeType = signatureTrustStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_TYPE);
String storePassword = signatureTrustStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PASSWORD);
if(StringUtils.isNotEmpty(storePath) && StringUtils.isNotEmpty(storeType) && StringUtils.isNotEmpty(storePassword)) {
merlinTruststore = GestoreKeystoreCache.getMerlinTruststore(requestInfo, storePath, storeType, storePassword);
}
else {
merlinTruststore = new MerlinTruststore(signatureTrustStoreProperties);
}
signatureTrustStoreKS = merlinTruststore.getTrustStore();
}
// Istanzio keystore
// 1. Property Merlin
if(signatureStore!=null){
aliasSignaturePassword = (String) messageSecurityContext.getIncomingProperties().get(SecurityConstants.SIGNATURE_PASSWORD);
if(aliasSignaturePassword==null){
throw new UtilsException(SecurityConstants.SIGNATURE_PASSWORD+SUFFIX_NON_FORNITA);
}
MerlinKeystore merlinKeystore = GestoreKeystoreCache.getMerlinKeystore(requestInfo, signatureStore, aliasSignaturePassword);
signatureKS = merlinKeystore.getKeyStore();
}
else if(signatureStoreProperties!=null) {
MerlinKeystore merlinKeystore = null;
String storePath = signatureStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PATH);
String storeType = signatureStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_TYPE);
String storePassword = signatureStoreProperties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PASSWORD);
BYOKRequestParams byokParams = getBYOKRequestParams(requestInfo, signatureStoreProperties);
if(StringUtils.isNotEmpty(storePath) && StringUtils.isNotEmpty(storeType) && StringUtils.isNotEmpty(storePassword)) {
merlinKeystore = GestoreKeystoreCache.getMerlinKeystore(requestInfo, storePath, storeType, storePassword, aliasSignaturePassword, byokParams);
}
else {
merlinKeystore = new MerlinKeystore(signatureStoreProperties, aliasSignaturePassword);
}
signatureKS = merlinKeystore.getKeyStore();
}
// 2. Multi Property
else if(multiSignatureStore!=null){
multiKeystore = GestoreKeystoreCache.getMultiKeystore(requestInfo, multiSignatureStore);
if(SecurityConstants.MULTI_USER_KEYWORD_FRUITORE.equals(aliasSignatureUser) &&
messageSecurityContext.getIdFruitore()!=null && messageSecurityContext.getIdFruitore().getNome()!=null){
String fruitore = messageSecurityContext.getIdFruitore().getNome();
signatureKS = multiKeystore.getKeyStore(fruitore);
aliasSignatureUser = multiKeystore.getKeyAlias(fruitore);
aliasSignaturePassword = multiKeystore.getKeyPassword(fruitore);
}
else if(SecurityConstants.MULTI_USER_KEYWORD_EROGATORE.equals(aliasSignatureUser) &&
messageSecurityContext.getIdServizio()!=null &&
messageSecurityContext.getIdServizio().getSoggettoErogatore()!=null &&
messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome()!=null){
String erogatore = messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome();
signatureKS = multiKeystore.getKeyStore(erogatore);
aliasSignatureUser = multiKeystore.getKeyAlias(erogatore);
aliasSignaturePassword = multiKeystore.getKeyPassword(erogatore);
}
else if(SecurityConstants.MULTI_USER_KEYWORD_FRUITORE_EROGATORE.equals(aliasSignatureUser) &&
messageSecurityContext.getIdFruitore()!=null && messageSecurityContext.getIdFruitore().getNome()!=null &&
messageSecurityContext.getIdServizio()!=null &&
messageSecurityContext.getIdServizio().getSoggettoErogatore()!=null &&
messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome()!=null){
String fruitore = messageSecurityContext.getIdFruitore().getNome();
String erogatore = messageSecurityContext.getIdServizio().getSoggettoErogatore().getNome();
String aliasFruitoreErogatore = fruitore+"-"+erogatore;
String aliasErogatoreFruitore = erogatore+"-"+fruitore;
if(multiKeystore.existsAlias(aliasFruitoreErogatore)){
signatureKS = multiKeystore.getKeyStore(aliasFruitoreErogatore);
aliasSignatureUser = multiKeystore.getKeyAlias(aliasFruitoreErogatore);
aliasSignaturePassword = multiKeystore.getKeyPassword(aliasFruitoreErogatore);
}
else if(multiKeystore.existsAlias(aliasErogatoreFruitore)){
signatureKS = multiKeystore.getKeyStore(aliasErogatoreFruitore);
aliasSignatureUser = multiKeystore.getKeyAlias(aliasErogatoreFruitore);
aliasSignaturePassword = multiKeystore.getKeyPassword(aliasErogatoreFruitore);
}
else{
throw new UtilsException(PREFIX_ALIAS+"["+aliasFruitoreErogatore+"] o ["+aliasErogatoreFruitore+"]"+SUFFIX_NON_TROVATO_MULTIKEYSTORE);
}
}
else if(SecurityConstants.MULTI_USER_KEYWORD_PORTA_DOMINIO_FRUITORE.equals(aliasSignatureUser) &&
messageSecurityContext.getPddFruitore()!=null){
String fruitore = messageSecurityContext.getPddFruitore();
signatureKS = multiKeystore.getKeyStore(fruitore);
aliasSignatureUser = multiKeystore.getKeyAlias(fruitore);
aliasSignaturePassword = multiKeystore.getKeyPassword(fruitore);
}
else if(SecurityConstants.MULTI_USER_KEYWORD_PORTA_DOMINIO_EROGATORE.equals(aliasSignatureUser) &&
messageSecurityContext.getPddErogatore()!=null){
String erogatore = messageSecurityContext.getPddErogatore();
signatureKS = multiKeystore.getKeyStore(erogatore);
aliasSignatureUser = multiKeystore.getKeyAlias(erogatore);
aliasSignaturePassword = multiKeystore.getKeyPassword(erogatore);
}
else if(SecurityConstants.MULTI_USER_KEYWORD_IDENTIFICATIVO_PORTA_FRUITORE.equals(aliasSignatureUser) &&
messageSecurityContext.getIdFruitore()!=null && messageSecurityContext.getIdFruitore().getCodicePorta()!=null){
String fruitore = messageSecurityContext.getIdFruitore().getCodicePorta();
signatureKS = multiKeystore.getKeyStore(fruitore);
aliasSignatureUser = multiKeystore.getKeyAlias(fruitore);
aliasSignaturePassword = multiKeystore.getKeyPassword(fruitore);
}
else if(SecurityConstants.MULTI_USER_KEYWORD_IDENTIFICATIVO_PORTA_EROGATORE.equals(aliasSignatureUser) &&
messageSecurityContext.getIdServizio()!=null &&
messageSecurityContext.getIdServizio().getSoggettoErogatore()!=null &&
messageSecurityContext.getIdServizio().getSoggettoErogatore().getCodicePorta()!=null){
String erogatore = messageSecurityContext.getIdServizio().getSoggettoErogatore().getCodicePorta();
signatureKS = multiKeystore.getKeyStore(erogatore);
aliasSignatureUser = multiKeystore.getKeyAlias(erogatore);
aliasSignaturePassword = multiKeystore.getKeyPassword(erogatore);
}
else{
signatureKS = multiKeystore.getKeyStore(aliasSignatureUser);
aliasSignaturePassword = multiKeystore.getKeyPassword(aliasSignatureUser);
aliasSignatureUser = multiKeystore.getKeyAlias(aliasSignatureUser); // aggiorno con identita alias del keystore
}
}
// Istanzio JWKSet
if(signatureJWKSetFile!=null) {
signatureJWKSet = new JWKSet(new String(readResources(signatureJWKSetFile)));
}
if(signatureKS==null && signatureTrustStoreKS==null && signatureJWKSet==null) {
throw new UtilsException("Nessuna modalita' di recupero del TrustStore per la funzionalita' di Signature indicata");
}
SignatureBean bean = new SignatureBean();
bean.setKeystore(signatureKS);
bean.setTruststore(signatureTrustStoreKS);
bean.setJwkSet(signatureJWKSet);
bean.setUser(aliasSignatureUser);
bean.setPassword(aliasSignaturePassword);
bean.setCrlPath(crlPath);
bean.setMultiKeystore(multiKeystore);
return bean;
}
private static byte[] readResources(String path) throws UtilsException, FileNotFoundException, URISyntaxException {
byte [] b = null;
if(path==null) {
return b;
}
if(path.startsWith("http") || path.startsWith("https")) {
HttpResponse httpResponse = HttpUtilities.getHTTPResponse(path, 60000, 10000);
if(httpResponse==null || httpResponse.getContent()==null) {
throw new UtilsException("Resource '"+path+"' unavailable");
}
if(httpResponse.getResultHTTPOperation()!=200) {
throw new UtilsException("Retrieve resource '"+path+"' failed (returnCode:"+httpResponse.getResultHTTPOperation()+")");
}
return httpResponse.getContent();
}
else if(path.startsWith("file")){
File f = new File(new URI(path));
return FileSystemUtilities.readBytesFromFile(f);
}
else {
File f = new File(path);
if(!f.exists()) {
throw new UtilsException("File '"+f.getAbsolutePath()+"' not exists");
}
return FileSystemUtilities.readBytesFromFile(f);
}
}
private static BYOKRequestParams getBYOKRequestParams(RequestInfo requestInfo, Properties properties) throws UtilsException{
String keyStoreByokPolicy = properties.getProperty(KeystoreConstants.PROPERTY_KEYSTORE_PATH_BYOK);
BYOKRequestParams byokParams = null;
if (keyStoreByokPolicy != null) {
keyStoreByokPolicy = keyStoreByokPolicy.trim();
if(BYOKProvider.isPolicyDefined(keyStoreByokPolicy)){
try {
byokParams = BYOKProvider.getBYOKRequestParamsByUnwrapBYOKPolicy(keyStoreByokPolicy,
requestInfo!=null && requestInfo.getDynamicMap()!=null ? requestInfo.getDynamicMap() : new HashMap<>() );
}catch(Exception e) {
throw new UtilsException(e.getMessage(),e);
}
}
}
return byokParams;
}
}