IdentificazioneApplicativoMittenteUtils.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.protocol.modipa.validator;

  21. import java.security.cert.X509Certificate;
  22. import java.util.List;
  23. import java.util.Map;

  24. import org.apache.commons.lang.StringUtils;
  25. import org.openspcoop2.core.config.Credenziali;
  26. import org.openspcoop2.core.config.ServizioApplicativo;
  27. import org.openspcoop2.core.config.constants.CostantiConfigurazione;
  28. import org.openspcoop2.core.config.constants.PortaApplicativaSoggettiFruitori;
  29. import org.openspcoop2.core.config.constants.StatoFunzionalita;
  30. import org.openspcoop2.core.config.driver.DriverConfigurazioneNotFound;
  31. import org.openspcoop2.core.config.driver.FiltroRicercaProtocolPropertyConfig;
  32. import org.openspcoop2.core.constants.CostantiLabel;
  33. import org.openspcoop2.core.id.IDServizioApplicativo;
  34. import org.openspcoop2.core.id.IDSoggetto;
  35. import org.openspcoop2.core.registry.PortaDominio;
  36. import org.openspcoop2.core.registry.Soggetto;
  37. import org.openspcoop2.message.OpenSPCoop2Message;
  38. import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
  39. import org.openspcoop2.pdd.core.GestoreRichieste;
  40. import org.openspcoop2.pdd.logger.MsgDiagnostico;
  41. import org.openspcoop2.pdd.services.core.RicezioneBusteGestioneAutenticazione;
  42. import org.openspcoop2.protocol.engine.ConfigurazioneFiltroServiziApplicativi;
  43. import org.openspcoop2.protocol.modipa.constants.ModIConsoleCostanti;
  44. import org.openspcoop2.protocol.modipa.constants.ModICostanti;
  45. import org.openspcoop2.protocol.registry.RegistroServiziManager;
  46. import org.openspcoop2.protocol.sdk.Busta;
  47. import org.openspcoop2.protocol.sdk.Context;
  48. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  49. import org.openspcoop2.protocol.sdk.ProtocolException;
  50. import org.openspcoop2.protocol.sdk.Trasmissione;
  51. import org.openspcoop2.protocol.sdk.properties.ProtocolPropertiesUtils;
  52. import org.openspcoop2.protocol.sdk.registry.ProtocolFiltroRicercaServiziApplicativi;
  53. import org.openspcoop2.protocol.sdk.state.IState;
  54. import org.openspcoop2.protocol.sdk.state.RequestFruitore;
  55. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  56. import org.openspcoop2.protocol.utils.ModIUtils;
  57. import org.openspcoop2.security.keystore.MerlinKeystore;
  58. import org.openspcoop2.security.keystore.cache.GestoreKeystoreCache;
  59. import org.openspcoop2.utils.certificate.ArchiveLoader;
  60. import org.openspcoop2.utils.certificate.ArchiveType;
  61. import org.openspcoop2.utils.certificate.Certificate;
  62. import org.openspcoop2.utils.certificate.CertificateInfo;
  63. import org.openspcoop2.utils.certificate.CertificateUtils;
  64. import org.openspcoop2.utils.certificate.PrincipalType;
  65. import org.slf4j.Logger;

  66. /**
  67.  * IdentificazioneApplicativoMittenteUtils
  68.  *
  69.  * @author Poli Andrea (apoli@link.it)
  70.  * @author $Author$
  71.  * @version $Rev$, $Date$
  72.  */
  73. public class IdentificazioneApplicativoMittenteUtils {
  74.    
  75.     private IdentificazioneApplicativoMittenteUtils() {}

  76.     private static void logError(Logger log, String msg, Exception e) {
  77.         log.error(msg,e);
  78.     }
  79.    
  80.     // invocato in AbstractModIValidazioneSintatticaCommons e di conseguenza in ModIValidazioneSintatticaRest e ModIValidazioneSintatticaSoap durante il trattamento del token di sicurezza
  81.     public static IDServizioApplicativo identificazioneApplicativoMittenteByX509(Logger log, IState state, X509Certificate x509, OpenSPCoop2Message msg, Busta busta,
  82.             Context context, IProtocolFactory<?> factory, RequestInfo requestInfo, MsgDiagnostico msgDiag) throws ProtocolException {
  83.         try {
  84.            
  85.             /** SICUREZZA MESSAGGIO **/
  86.                                    
  87.             IDSoggetto idSoggettoMittente = null;
  88.             if(busta.getTipoMittente()!=null && busta.getMittente()!=null) {
  89.                 idSoggettoMittente = new IDSoggetto(busta.getTipoMittente(),busta.getMittente());
  90.             }
  91.            
  92.             IDServizioApplicativo idServizioApplicativo = null;
  93.            
  94.             boolean rilevatoSoggettoIntermediario = false;
  95.            
  96.             if(x509!=null) {
  97.                
  98.                 CertificateInfo certificate = new CertificateInfo(x509, "applicativoMittente");
  99.            
  100.                 RequestFruitore requestFruitoreToken = null;
  101.                 String certificateKey = null;
  102.                 try {
  103.                     certificateKey = GestoreRichieste.toCertificateKey(certificate);
  104.                     if(certificateKey!=null) {
  105.                         requestFruitoreToken = GestoreRichieste.readFruitoreTokenModI(requestInfo, certificateKey);
  106.                     }
  107.                 }catch(Exception t) {
  108.                     // ignore
  109.                 }  
  110.                
  111.                 if(certificateKey!=null && requestFruitoreToken!=null && requestFruitoreToken.getCertificateKey()!=null &&
  112.                         requestFruitoreToken.getCertificateKey().equals(certificateKey)) {
  113.                     idServizioApplicativo = requestFruitoreToken.getIdServizioApplicativoFruitore();
  114.                 }
  115.                 else {
  116.                     idServizioApplicativo = identificazioneApplicativoMittenteByX509Engine(state, requestInfo, certificate);
  117.                 }
  118.                
  119.                 if(idServizioApplicativo!=null) {
  120.                     if(idSoggettoMittente==null) {
  121.                         idSoggettoMittente = idServizioApplicativo.getIdSoggettoProprietario();
  122.                     }
  123.                     // Non ha senso poter identificare entrambi con le stesse credenziali
  124.                     else if(!idServizioApplicativo.getIdSoggettoProprietario().equals(idSoggettoMittente)) {
  125.                         Soggetto soggettoCanale = RegistroServiziManager.getInstance(state).getSoggetto(idSoggettoMittente, null, requestInfo);
  126.                         if(ModIUtils.isSoggettoCanaleIntermediario(soggettoCanale, log)) {
  127.                             String idTransazione = null;
  128.                             if(context.containsKey(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE)) {
  129.                                 idTransazione = (String) context.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE);
  130.                             }
  131.                             RicezioneBusteGestioneAutenticazione.registraIntermediario(idSoggettoMittente, msgDiag, idTransazione, null, context);
  132.                             // assegno ad idSoggettoMittente il soggetto dell'applicativo
  133.                             idSoggettoMittente = idServizioApplicativo.getIdSoggettoProprietario();
  134.                             rilevatoSoggettoIntermediario = true;
  135.                         }
  136.                         else {
  137.                             String msgError = ModIUtils.getMessaggioErroreDominioCanaleDifferenteDominioApplicativo(idServizioApplicativo, idSoggettoMittente);
  138.                             throw new ProtocolException(msgError);
  139.                         }
  140.                     }
  141.                 }
  142.                
  143.                 if(certificateKey!=null && requestFruitoreToken==null && idServizioApplicativo!=null) {
  144.                    
  145.                     ConfigurazionePdDManager configurazionePdDManager = ConfigurazionePdDManager.getInstance(state);
  146.                     RegistroServiziManager registroServiziManager = RegistroServiziManager.getInstance(state);                  
  147.                    
  148.                     RequestFruitore rf = new RequestFruitore();
  149.                    
  150.                     rf.setIdSoggettoFruitore(idServizioApplicativo.getIdSoggettoProprietario());
  151.                     try {
  152.                         org.openspcoop2.core.registry.Soggetto soggettoRegistry = registroServiziManager.getSoggetto(idServizioApplicativo.getIdSoggettoProprietario(), null, requestInfo);
  153.                         rf.setSoggettoFruitoreRegistry(soggettoRegistry);
  154.                     }catch(Exception t) {
  155.                         logError(log, "Errore durante la lettura del soggetto '"+idServizioApplicativo.getIdSoggettoProprietario()+"' dal registro: "+t.getMessage(),t);
  156.                     }  
  157.                     try {
  158.                         org.openspcoop2.core.config.Soggetto soggettoConfig = configurazionePdDManager.getSoggetto(idServizioApplicativo.getIdSoggettoProprietario(), requestInfo);
  159.                         rf.setSoggettoFruitoreConfig(soggettoConfig);
  160.                     }catch(Exception t) {
  161.                         logError(log, "Errore durante la lettura del soggetto '"+idServizioApplicativo.getIdSoggettoProprietario()+"' dalla configurazione: "+t.getMessage(),t);
  162.                     }  
  163.                     try {
  164.                         String idPorta = configurazionePdDManager.getIdentificativoPorta(idServizioApplicativo.getIdSoggettoProprietario(), factory, requestInfo);
  165.                         rf.setSoggettoFruitoreIdentificativoPorta(idPorta);
  166.                     }catch(Exception t) {
  167.                         logError(log, "Errore durante la lettura dell'identificativo porta del soggetto '"+idServizioApplicativo.getIdSoggettoProprietario()+"' dal registro: "+t.getMessage(),t);
  168.                     }  
  169.                     try {
  170.                         boolean soggettoVirtualeFRU = configurazionePdDManager.isSoggettoVirtuale(idServizioApplicativo.getIdSoggettoProprietario(), requestInfo);
  171.                         rf.setSoggettoFruitoreSoggettoVirtuale(soggettoVirtualeFRU);
  172.                     }catch(Exception t) {
  173.                         logError(log, "Errore durante la lettura dell'indicazione sul soggetto virtuale associato al soggetto '"+idServizioApplicativo.getIdSoggettoProprietario()+"' dal registro: "+t.getMessage(),t);
  174.                     }  
  175.                     try {
  176.                         if(rf!=null) {
  177.                             if(rf.getSoggettoFruitoreRegistry().getPortaDominio()!=null &&
  178.                                     StringUtils.isNotEmpty(rf.getSoggettoFruitoreRegistry().getPortaDominio())) {
  179.                                 PortaDominio pdd = registroServiziManager.getPortaDominio(rf.getSoggettoFruitoreRegistry().getPortaDominio(), null, requestInfo);
  180.                                 rf.setSoggettoFruitorePddReaded(true);
  181.                                 rf.setSoggettoFruitorePdd(pdd);
  182.                             }
  183.                             else {
  184.                                 rf.setSoggettoFruitorePddReaded(true);
  185.                             }
  186.                         }
  187.                     }catch(Exception t) {
  188.                         logError(log, "Errore durante la lettura dei dati della pdd del soggetto '"+idServizioApplicativo.getIdSoggettoProprietario()+"' dal registro: "+t.getMessage(),t);
  189.                     }  
  190.                     try {
  191.                         String impl = registroServiziManager.getImplementazionePdD(idServizioApplicativo.getIdSoggettoProprietario(), null, requestInfo);
  192.                         rf.setSoggettoFruitoreImplementazionePdd(impl);
  193.                     }catch(Exception t) {
  194.                         logError(log, "Errore durante la lettura dell'implementazione pdd del soggetto '"+idServizioApplicativo.getIdSoggettoProprietario()+"' dal registro: "+t.getMessage(),t);
  195.                     }  
  196.                        
  197.                     rf.setIdServizioApplicativoFruitore(idServizioApplicativo);
  198.                     try {
  199.                         org.openspcoop2.core.config.ServizioApplicativo sa = configurazionePdDManager.getServizioApplicativo(idServizioApplicativo, requestInfo);
  200.                         rf.setServizioApplicativoFruitore(sa);
  201.                     }catch(Exception t) {
  202.                         logError(log, "Errore durante la lettura del servizio applicativo '"+idServizioApplicativo+"' dalla configurazione: "+t.getMessage(),t);
  203.                     }
  204.                     // nel token non ha senso rf.setServizioApplicativoFruitoreAnonimo(saApplicativoToken==null);
  205.                    
  206.                     try {
  207.                         rf.setCertificateKey(certificateKey);
  208.                         GestoreRichieste.saveRequestFruitoreTokenModI(requestInfo, rf);
  209.                     } catch (Exception e) {
  210.                         logError(log, "Errore durante il salvataggio nella cache e nel thread context delle informazioni sul fruitore token ModI: "+e.getMessage(),e);
  211.                     }
  212.                    
  213.                 }
  214.             }
  215.            
  216.             /** IMPOSTAZIONI */
  217.            
  218.             setInformazioniInBustaAndContext(log, state, busta, context, requestInfo,
  219.                     rilevatoSoggettoIntermediario, idSoggettoMittente, idServizioApplicativo);
  220.            
  221.             return idServizioApplicativo;
  222.            
  223.         }catch(Exception e) {
  224.             logError(log, "Errore durante il riconoscimento dell'applicativo mittente (tramite la sicurezza messaggio): "+e.getMessage(),e);
  225.             throw new ProtocolException(e.getMessage(),e);
  226.         }
  227.     }
  228.            
  229.     private static IDServizioApplicativo identificazioneApplicativoMittenteByX509Engine(IState state, RequestInfo requestInfo, CertificateInfo certificate) throws ProtocolException {
  230.            
  231.         try {
  232.        
  233.             ConfigurazionePdDManager configurazionePdDManager = ConfigurazionePdDManager.getInstance(state);
  234.                                    
  235.             String subject = null;
  236.             if(certificate!=null && certificate.getCertificate()!=null) {
  237.                 subject = certificate.getCertificate().getSubjectX500Principal().toString();
  238.             }
  239.             String issuer = null;
  240.             if(certificate!=null && certificate.getCertificate()!=null && certificate.getCertificate().getIssuerX500Principal()!=null) {
  241.                 issuer = certificate.getCertificate().getIssuerX500Principal().toString();
  242.             }
  243.            
  244.             IDServizioApplicativo idServizioApplicativo = null;
  245.            
  246.             // NOTA: il fatto di essersi registrati come strict o come non strict è insito nella registrazione dell'applicativo
  247.            
  248.             // FIX: cerco solo applicativi del profilo ModI esterno
  249.             ConfigurazioneFiltroServiziApplicativi filtroFirma = ConfigurazioneFiltroServiziApplicativi.getFiltroApplicativiModIFirma();
  250.            
  251.             // 1. Prima si cerca per certificato strict
  252.             if(certificate!=null) {
  253.                 idServizioApplicativo = configurazionePdDManager.getIdServizioApplicativoByCredenzialiSsl(certificate, true,
  254.                         filtroFirma.getTipiSoggetti(), filtroFirma.isIncludiApplicativiNonModI(), filtroFirma.isIncludiApplicativiModIEsterni(), filtroFirma.isIncludiApplicativiModIInterni());
  255.             }
  256.             if(idServizioApplicativo==null &&
  257.                 // 2. Poi per certificato no strict
  258.                 certificate!=null) {
  259.                 idServizioApplicativo = configurazionePdDManager.getIdServizioApplicativoByCredenzialiSsl(certificate, false,
  260.                         filtroFirma.getTipiSoggetti(), filtroFirma.isIncludiApplicativiNonModI(), filtroFirma.isIncludiApplicativiModIEsterni(), filtroFirma.isIncludiApplicativiModIInterni());
  261.             }
  262.             if(idServizioApplicativo==null) {
  263.                 // 3. per subject/issuer
  264.                 idServizioApplicativo = configurazionePdDManager.getIdServizioApplicativoByCredenzialiSsl(subject, issuer,
  265.                         filtroFirma.getTipiSoggetti(), filtroFirma.isIncludiApplicativiNonModI(), filtroFirma.isIncludiApplicativiModIEsterni(), filtroFirma.isIncludiApplicativiModIInterni());    
  266.             }
  267.             if(idServizioApplicativo==null) {
  268.                 // 4. solo per subject
  269.                 idServizioApplicativo = configurazionePdDManager.getIdServizioApplicativoByCredenzialiSsl(subject, null,
  270.                         filtroFirma.getTipiSoggetti(), filtroFirma.isIncludiApplicativiNonModI(), filtroFirma.isIncludiApplicativiModIEsterni(), filtroFirma.isIncludiApplicativiModIInterni());    
  271.             }
  272.             if(idServizioApplicativo==null &&
  273.                 // 5. provare a vedere se si tratta di un applicativo interno (multi-tenant)
  274.                
  275.                 StatoFunzionalita.ABILITATO.equals(configurazionePdDManager.getConfigurazioneMultitenant().getStato()) &&
  276.                         !PortaApplicativaSoggettiFruitori.SOGGETTI_ESTERNI.equals(configurazionePdDManager.getConfigurazioneMultitenant().getErogazioneSceltaSoggettiFruitori())) {
  277.                    
  278.                 ProtocolFiltroRicercaServiziApplicativi filtro = createFilter(subject, issuer);
  279.                                
  280.                 List<IDServizioApplicativo> list = null;
  281.                 try {
  282.                     list = configurazionePdDManager.getAllIdServiziApplicativi(filtro);
  283.                 }catch(DriverConfigurazioneNotFound notFound) {
  284.                     // ignore
  285.                 }
  286.                 if(list!=null) {
  287.                     for (IDServizioApplicativo idServizioApplicativoSubjectIssuerCheck : list) {
  288.                         // Possono esistere piu' sil che hanno un CN con subject e issuer.
  289.                        
  290.                         ServizioApplicativo sa = configurazionePdDManager.getServizioApplicativo(idServizioApplicativoSubjectIssuerCheck, requestInfo);
  291.                            
  292.                         java.security.cert.Certificate certificatoCheck = readServizioApplicativoByCertificate(sa, requestInfo);

  293.                         if(
  294.                             /**if(certificate.equals(certificatoCheck.getCertificate(),true)) {*/
  295.                             certificatoCheck instanceof java.security.cert.X509Certificate &&
  296.                             certificate!=null && certificate.equals(((java.security.cert.X509Certificate)certificatoCheck),true)) {
  297.                             idServizioApplicativo = idServizioApplicativoSubjectIssuerCheck;
  298.                             break;
  299.                         }
  300.                        
  301.                     }
  302.                 }
  303.    
  304.             }
  305.                
  306.             return idServizioApplicativo;
  307.            
  308.         }catch(Exception e) {
  309.             throw new ProtocolException(e.getMessage(),e);
  310.         }
  311.     }
  312.            
  313.            
  314.     public static IDServizioApplicativo identificazioneApplicativoMittenteByToken(Logger log, IState state, Busta busta, Context context, RequestInfo requestInfo, MsgDiagnostico msgDiag, StringBuilder errorDetails) throws ProtocolException {
  315.         try {  
  316.            
  317.             // letto tramite la sicurezza messaggio nella validazione sintattica
  318.            
  319.             IDSoggetto idSoggettoMittente = null;
  320.             if(busta.getTipoMittente()!=null && busta.getMittente()!=null) {
  321.                 idSoggettoMittente = new IDSoggetto(busta.getTipoMittente(),busta.getMittente());
  322.             }
  323.            
  324.             IDServizioApplicativo idServizioApplicativo = null;
  325.             if(busta.getServizioApplicativoFruitore()!=null && idSoggettoMittente!=null) {
  326.                 idServizioApplicativo = new IDServizioApplicativo();
  327.                 idServizioApplicativo.setNome(busta.getServizioApplicativoFruitore());
  328.                 idServizioApplicativo.setIdSoggettoProprietario(idSoggettoMittente);
  329.             }
  330.            
  331.             boolean rilevatoSoggettoIntermediario = false;
  332.            
  333.            
  334.             /** SICUREZZA TOKEN **/
  335.            
  336.             IDServizioApplicativo idServizioApplicativoToken = null;
  337.             if(context!=null && context.containsKey(org.openspcoop2.core.constants.Costanti.ID_APPLICATIVO_TOKEN)) {
  338.                 idServizioApplicativoToken = (IDServizioApplicativo) context.getObject(org.openspcoop2.core.constants.Costanti.ID_APPLICATIVO_TOKEN);
  339.                
  340.                 if(idSoggettoMittente==null) {
  341.                     idSoggettoMittente = idServizioApplicativoToken.getIdSoggettoProprietario();
  342.                 }
  343.                 // Non ha senso poter identificare entrambi con le stesse credenziali
  344.                 else if(!idServizioApplicativoToken.getIdSoggettoProprietario().equals(idSoggettoMittente)) {
  345.                     Soggetto soggettoCanale = RegistroServiziManager.getInstance(state).getSoggetto(idSoggettoMittente, null, requestInfo);
  346.                     if(ModIUtils.isSoggettoCanaleIntermediario(soggettoCanale, log)) {
  347.                         String idTransazione = null;
  348.                         if(context.containsKey(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE)) {
  349.                             idTransazione = (String) context.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE);
  350.                         }
  351.                         RicezioneBusteGestioneAutenticazione.registraIntermediario(idSoggettoMittente, msgDiag, idTransazione, null, context);
  352.                         // assegno ad idSoggettoMittente il soggetto dell'applicativo
  353.                         idSoggettoMittente = idServizioApplicativoToken.getIdSoggettoProprietario();
  354.                         rilevatoSoggettoIntermediario = true;
  355.                     }
  356.                     else {
  357.                         String msgError = ModIUtils.getMessaggioErroreDominioCanaleDifferenteDominioApplicativo(idServizioApplicativoToken, idSoggettoMittente);
  358.                         errorDetails.append(msgError);
  359.                         throw new ProtocolException(msgError);
  360.                     }      
  361.                 }
  362.                
  363.                 if(idServizioApplicativo!=null) {
  364.                     // già identificato anche in token di sicurezza messaggio
  365.                     // DEPRECATO: non può succedere, poichè se vi è attivo una autenticazione token, viene usata quella per identificare l'applicativo mittente
  366.                     // questo caso quindi non può succedere, si lascia il codice per controllo di robustezza
  367.                     if(!idServizioApplicativo.equals(idServizioApplicativoToken)) {
  368.                         String msgError = "Rilevati due token di sicurezza firmati da applicativi differenti: '"+idServizioApplicativo.getNome()+
  369.                                 "' e '"+idServizioApplicativoToken.getNome()+"'";
  370.                         errorDetails.append(msgError);
  371.                         throw new ProtocolException(msgError);
  372.                     }
  373.                 }
  374.                 else {
  375.                     idServizioApplicativo = idServizioApplicativoToken;
  376.                 }
  377.             }
  378.             else {
  379.                 return null;
  380.             }
  381.            
  382.            
  383.             /** IMPOSTAZIONI */
  384.            
  385.             setInformazioniInBustaAndContext(log, state, busta, context, requestInfo,
  386.                     rilevatoSoggettoIntermediario, idSoggettoMittente, idServizioApplicativo);
  387.            
  388.             return idServizioApplicativo;
  389.            
  390.         }catch(Exception e) {
  391.             logError(log, "Errore durante il riconoscimento dell'applicativo mittente (tramite il token): "+e.getMessage(),e);
  392.             throw new ProtocolException(e.getMessage(),e);
  393.         }
  394.     }
  395.      
  396.    
  397.     public static void checkApplicativoTokenByX509(Logger log, IDServizioApplicativo idServizioApplicativo,
  398.             IState state, RequestInfo requestInfo,
  399.             String tipoToken, CertificateInfo certificatoSicurezzaMessaggio, StringBuilder errorDetails) throws ProtocolException {
  400.         try {
  401.            
  402.             ConfigurazionePdDManager configurazionePdDManager = ConfigurazionePdDManager.getInstance(state);
  403.            
  404.             ServizioApplicativo saToken = configurazionePdDManager.getServizioApplicativo(idServizioApplicativo, requestInfo);
  405.            
  406.             String cnSubjectSicurezzaMessaggio = certificatoSicurezzaMessaggio.getSubject().getCN();
  407.             String subjectSicurezzaMessaggio = certificatoSicurezzaMessaggio.getSubject().toString();
  408.             String issuerSicurezzaMessaggio = null;
  409.             if(certificatoSicurezzaMessaggio.getIssuer()!=null) {
  410.                 issuerSicurezzaMessaggio = certificatoSicurezzaMessaggio.getIssuer().toString();
  411.             }
  412.            
  413.             boolean registered = false;
  414.             if(saToken.getInvocazionePorta()!=null){
  415.                 for(int z=0;z<saToken.getInvocazionePorta().sizeCredenzialiList();z++){
  416.                    
  417.                     if(saToken.getInvocazionePorta().getCredenziali(z).getTipo() == null // default
  418.                             ||
  419.                             CostantiConfigurazione.CREDENZIALE_SSL.equals(saToken.getInvocazionePorta().getCredenziali(z).getTipo())){
  420.                        
  421.                         Credenziali c = saToken.getInvocazionePorta().getCredenziali(z);
  422.                        
  423.                         // 1. Prima si cerca per certificato strict
  424.                         // 2. Poi per certificato no strict
  425.                         if(c.getCertificate()!=null &&
  426.                             cnSubjectSicurezzaMessaggio.equals(c.getCnSubject())) {
  427.                             Certificate cer = ArchiveLoader.load(ArchiveType.CER, c.getCertificate(), 0, null);
  428.                             boolean strict = true;
  429.                             if(certificatoSicurezzaMessaggio.equals(cer.getCertificate(),strict)) {
  430.                                 registered=true;
  431.                                 break;
  432.                             }
  433.                             if(certificatoSicurezzaMessaggio.equals(cer.getCertificate(),!strict)) {
  434.                                 registered=true;
  435.                                 break;
  436.                             }
  437.                         }
  438.                        
  439.                         // 3. per subject/issuer
  440.                         // 4. solo per subject
  441.                         if(c.getSubject()!=null) {
  442.                        
  443.                             boolean subjectValid = CertificateUtils.sslVerify(c.getSubject(), subjectSicurezzaMessaggio, PrincipalType.SUBJECT, log);
  444.                             boolean issuerValid = true;
  445.                             if(subjectValid &&
  446.                                 c.getIssuer()!=null &&
  447.                                 issuerSicurezzaMessaggio!=null) {
  448.                                 issuerValid = CertificateUtils.sslVerify(c.getIssuer(), issuerSicurezzaMessaggio, PrincipalType.ISSUER, log);
  449.                             }
  450.                            
  451.                             if(subjectValid && issuerValid){
  452.                                 registered=true;
  453.                                 break;
  454.                             }
  455.                         }
  456.                                                
  457.                     }
  458.                    
  459.                 }
  460.             }
  461.            
  462.             // 5. provare a vedere se si tratta di un applicativo interno (multi-tenant)
  463.            
  464.             if(!registered &&
  465.                 StatoFunzionalita.ABILITATO.equals(configurazionePdDManager.getConfigurazioneMultitenant().getStato()) &&
  466.                 !PortaApplicativaSoggettiFruitori.SOGGETTI_ESTERNI.equals(configurazionePdDManager.getConfigurazioneMultitenant().getErogazioneSceltaSoggettiFruitori())) {
  467.                        
  468.                 java.security.cert.Certificate certificatoCheck = readServizioApplicativoByCertificate(saToken, requestInfo);

  469.                 if(
  470.                     /**if(certificate.equals(certificatoCheck.getCertificate(),true)) {*/
  471.                     certificatoCheck instanceof java.security.cert.X509Certificate &&
  472.                     certificatoSicurezzaMessaggio.equals(((java.security.cert.X509Certificate)certificatoCheck),true)) {
  473.                     registered=true;
  474.                 }
  475.             }
  476.            
  477.             if(!registered) {
  478.                
  479.                 StringBuilder sb = new StringBuilder();
  480.                 sb.append("subject=\"").append(subjectSicurezzaMessaggio).append("\"");
  481.                 if(issuerSicurezzaMessaggio!=null) {
  482.                     sb.append(" issuer=\"").append(issuerSicurezzaMessaggio).append("\"");
  483.                 }
  484.                
  485.                 String idApp = idServizioApplicativo.getNome() + " (Soggetto: "+idServizioApplicativo.getIdSoggettoProprietario().getNome()+")";
  486.                 String msgError = "Applicativo Mittente "+idApp+" non autorizzato; il certificato di firma ("+sb.toString()+") del security token ("+tipoToken+") non corrisponde all'applicativo";
  487.                 errorDetails.append(msgError);
  488.                 throw new ProtocolException(msgError);
  489.             }
  490.            
  491.         }catch(Exception e) {
  492.             logError(log, "Errore durante la verifica del certificato di firma associato all'applicativo token: "+e.getMessage(),e);
  493.             throw new ProtocolException(e.getMessage(),e);
  494.         }
  495.     }
  496.    
  497.    
  498.    
  499.     public static void setInformazioniInBustaAndContext(Logger log, IState state, Busta busta, Context context, RequestInfo requestInfo,
  500.             boolean rilevatoSoggettoIntermediario, IDSoggetto idSoggettoMittente, IDServizioApplicativo idServizioApplicativo) throws ProtocolException {
  501.         try {
  502.                        
  503.             if(idSoggettoMittente!=null) {
  504.                 busta.setTipoMittente(idSoggettoMittente.getTipo());
  505.                 busta.setMittente(idSoggettoMittente.getNome());
  506.                
  507.                 if(rilevatoSoggettoIntermediario) {
  508.                     // devo aggiornare anche altri campi della busta
  509.                     try {
  510.                         RegistroServiziManager registroServiziManager = RegistroServiziManager.getInstance(state);
  511.                         Soggetto soggetto = registroServiziManager.getSoggetto(idSoggettoMittente, null, requestInfo);
  512.                         busta.setIdentificativoPortaMittente(soggetto.getIdentificativoPorta());
  513.                         if(busta.sizeListaTrasmissioni()==1) {
  514.                             Trasmissione tr = busta.getTrasmissione(0);
  515.                             tr.setTipoOrigine(idSoggettoMittente.getTipo());
  516.                             tr.setOrigine(idSoggettoMittente.getNome());
  517.                             tr.setIdentificativoPortaOrigine(soggetto.getIdentificativoPorta());
  518.                         }
  519.                     }catch(Exception t) {
  520.                         // ignore
  521.                     }
  522.                 }
  523.                
  524.                 try {
  525.                     if(!context.containsKey(org.openspcoop2.core.constants.Costanti.PROPRIETA_SOGGETTO_FRUITORE)) {
  526.                         RegistroServiziManager registroServiziManager = RegistroServiziManager.getInstance(state);
  527.                         Soggetto soggetto = registroServiziManager.getSoggetto(idSoggettoMittente, null, requestInfo);
  528.                         Map<String, String> configProperties = registroServiziManager.getProprietaConfigurazione(soggetto);
  529.                         if (configProperties != null && !configProperties.isEmpty()) {
  530.                             context.addObject(org.openspcoop2.core.constants.Costanti.PROPRIETA_SOGGETTO_FRUITORE, configProperties);
  531.                         }  
  532.                     }
  533.                 }catch(Exception t) {
  534.                     // ignore
  535.                 }
  536.             }
  537.            
  538.         }catch(Exception e) {
  539.             logError(log, "Errore durante l'impostazione nel contest del soggetto mittente: "+e.getMessage(),e);
  540.             throw new ProtocolException(e.getMessage(),e);
  541.         }
  542.        
  543.         try {
  544.            
  545.             if(idServizioApplicativo!=null) {
  546.                 busta.setServizioApplicativoFruitore(idServizioApplicativo.getNome());
  547.                
  548.                 try {
  549.                     if(!context.containsKey(org.openspcoop2.core.constants.Costanti.PROPRIETA_APPLICATIVO)) {
  550.                         ConfigurazionePdDManager configurazionePdDManager = ConfigurazionePdDManager.getInstance(state);
  551.                         ServizioApplicativo sa = configurazionePdDManager.getServizioApplicativo(idServizioApplicativo, requestInfo);
  552.                         Map<String, String> configProperties = configurazionePdDManager.getProprietaConfigurazione(sa);
  553.                         if (configProperties != null && !configProperties.isEmpty()) {
  554.                             context.addObject(org.openspcoop2.core.constants.Costanti.PROPRIETA_APPLICATIVO, configProperties);
  555.                         }  
  556.                     }
  557.                 }catch(Exception t) {
  558.                     // ignore
  559.                 }
  560.             }
  561.            
  562.         }catch(Exception e) {
  563.             logError(log, "Errore durante l'impostazione nel contest dell'applicativo mittente: "+e.getMessage(),e);
  564.             throw new ProtocolException(e.getMessage(),e);
  565.         }
  566.     }
  567.    
  568.    
  569.    
  570.    
  571.     public static ProtocolFiltroRicercaServiziApplicativi createFilter(String subject, String issuer) {
  572.         ProtocolFiltroRicercaServiziApplicativi filtro = new ProtocolFiltroRicercaServiziApplicativi();
  573.        
  574.         filtro.setTipoSoggetto(CostantiLabel.MODIPA_PROTOCOL_NAME);
  575.        
  576.         FiltroRicercaProtocolPropertyConfig filtroSubject = new FiltroRicercaProtocolPropertyConfig();
  577.         filtroSubject.setName(ModICostanti.MODIPA_KEY_CN_SUBJECT);
  578.         filtroSubject.setValueAsString(subject);
  579.         filtro.addProtocolProperty(filtroSubject);
  580.        
  581.         FiltroRicercaProtocolPropertyConfig filtroIssuer = new FiltroRicercaProtocolPropertyConfig();
  582.         filtroIssuer.setName(ModICostanti.MODIPA_KEY_CN_ISSUER);
  583.         filtroIssuer.setValueAsString(issuer);
  584.         filtro.addProtocolProperty(filtroIssuer);
  585.        
  586.         return filtro;
  587.     }
  588.    
  589.     public static java.security.cert.Certificate readServizioApplicativoByCertificate(ServizioApplicativo sa, RequestInfo requestInfo) throws ProtocolException {
  590.         if(sa!=null && sa.sizeProtocolPropertyList()>0) {
  591.                    
  592.             java.security.cert.Certificate certificatoCheck = null;
  593.                    
  594.             String mode = ProtocolPropertiesUtils.getOptionalStringValuePropertyConfig(sa.getProtocolPropertyList(), ModICostanti.MODIPA_KEYSTORE_MODE);
  595.             if(mode!=null && !"".equals(mode) && !ModICostanti.MODIPA_KEYSTORE_MODE_VALUE_ARCHIVE.equals(mode)) {
  596.                        
  597.                 byte [] certificateBytes = ProtocolPropertiesUtils.getOptionalBinaryValuePropertyConfig(sa.getProtocolPropertyList(), ModICostanti.MODIPA_KEYSTORE_CERTIFICATE);
  598.                 if(certificateBytes!=null) {
  599.                     org.openspcoop2.utils.certificate.Certificate c = null;
  600.                     try {
  601.                         c = ArchiveLoader.load(certificateBytes);
  602.                     }catch(Exception e) {
  603.                         throw new ProtocolException(e.getMessage(),e);
  604.                     }
  605.                     if(c!=null && c.getCertificate()!=null) {
  606.                         certificatoCheck = c.getCertificate().getCertificate();
  607.                     }
  608.                 }
  609.                
  610.             }
  611.             else {
  612.                
  613.                 byte [] keystoreBytes = ProtocolPropertiesUtils.getOptionalBinaryValuePropertyConfig(sa.getProtocolPropertyList(), ModICostanti.MODIPA_KEYSTORE_ARCHIVE);
  614.                 String keystoreType = ProtocolPropertiesUtils.getOptionalStringValuePropertyConfig(sa.getProtocolPropertyList(), ModICostanti.MODIPA_KEYSTORE_TYPE);
  615.                 String keystorePassword = ProtocolPropertiesUtils.getOptionalStringValuePropertyConfig(sa.getProtocolPropertyList(), ModICostanti.MODIPA_KEYSTORE_PASSWORD);
  616.                 String keyAlias = ProtocolPropertiesUtils.getOptionalStringValuePropertyConfig(sa.getProtocolPropertyList(), ModICostanti.MODIPA_KEY_ALIAS);
  617.                 if(keystoreBytes!=null && keystoreType!=null && keystorePassword!=null && keyAlias!=null) {
  618.                     ArchiveType archiveType = null;
  619.                     if(ModIConsoleCostanti.MODIPA_KEYSTORE_TYPE_VALUE_JKS.equals(keystoreType)) {
  620.                         archiveType = ArchiveType.JKS;
  621.                     }
  622.                     else {
  623.                         archiveType = ArchiveType.PKCS12;
  624.                     }
  625.                     try {
  626.                         MerlinKeystore merlinKs = GestoreKeystoreCache.getMerlinKeystore(requestInfo, keystoreBytes, archiveType.name(),
  627.                                 keystorePassword);
  628.                         certificatoCheck = merlinKs.getCertificate(keyAlias);
  629.                     }catch(Exception e) {
  630.                         throw new ProtocolException(e.getMessage(),e);
  631.                     }
  632.                 }
  633.             }

  634.             return certificatoCheck;
  635.         }
  636.            
  637.         return null;
  638.     }
  639. }