GestoreCredenzialiEngine.java
- /*
- * GovWay - A customizable API Gateway
- * https://govway.org
- *
- * Copyright (c) 2005-2025 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.pdd.core.credenziali.engine;
- import java.security.cert.CertStore;
- import java.util.List;
- import java.util.Map;
- import org.apache.commons.lang.StringUtils;
- import org.openspcoop2.core.config.constants.TipoAutenticazionePrincipal;
- import org.openspcoop2.core.constants.Costanti;
- import org.openspcoop2.core.id.IDSoggetto;
- import org.openspcoop2.message.OpenSPCoop2Message;
- import org.openspcoop2.message.utils.WWWAuthenticateErrorCode;
- import org.openspcoop2.message.utils.WWWAuthenticateGenerator;
- import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
- import org.openspcoop2.pdd.core.autenticazione.WWWAuthenticateConfig;
- import org.openspcoop2.pdd.core.connettori.InfoConnettoreIngresso;
- import org.openspcoop2.pdd.core.credenziali.Credenziali;
- import org.openspcoop2.pdd.core.credenziali.GestoreCredenzialiConfigurationException;
- import org.openspcoop2.pdd.core.credenziali.GestoreCredenzialiException;
- import org.openspcoop2.pdd.core.keystore.GestoreKeystoreCaching;
- import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
- import org.openspcoop2.protocol.engine.SecurityTokenUtilities;
- import org.openspcoop2.protocol.sdk.ChannelSecurityToken;
- import org.openspcoop2.protocol.sdk.Context;
- import org.openspcoop2.protocol.sdk.SecurityToken;
- import org.openspcoop2.protocol.sdk.constants.IntegrationFunctionError;
- import org.openspcoop2.protocol.sdk.state.RequestInfo;
- import org.openspcoop2.security.keystore.cache.GestoreOCSPResource;
- import org.openspcoop2.security.keystore.cache.GestoreOCSPValidator;
- import org.openspcoop2.utils.LoggerBuffer;
- import org.openspcoop2.utils.certificate.Certificate;
- import org.openspcoop2.utils.certificate.CertificateDecodeConfig;
- import org.openspcoop2.utils.certificate.CertificateUtils;
- import org.openspcoop2.utils.certificate.KeyStore;
- import org.openspcoop2.utils.certificate.PrincipalType;
- import org.openspcoop2.utils.transport.TransportUtils;
- import org.openspcoop2.utils.transport.http.IOCSPValidator;
- /**
- * GestoreCredenzialiEngine
- *
- * @author Poli Andrea (poli@link.it)
- * @author $Author$
- * @version $Rev$, $Date$
- */
- public class GestoreCredenzialiEngine {
- private static final String KEYWORD_GATEWAY_CREDENZIALI = "@@GatewayCredenziali@@";
- public static String getDBValuePrefixGatewayCredenziali(String identitaGateway, String credenzialiFornite) {
- return KEYWORD_GATEWAY_CREDENZIALI+identitaGateway+"@@"+credenzialiFornite;
- }
- public static boolean containsPrefixGatewayCredenziali(String value) {
- return value.startsWith(GestoreCredenzialiEngine.KEYWORD_GATEWAY_CREDENZIALI);
- }
- public static String erasePrefixGatewayCredenziali(String value) {
- if(value.startsWith(GestoreCredenzialiEngine.KEYWORD_GATEWAY_CREDENZIALI)) {
- String s = value.substring(GestoreCredenzialiEngine.KEYWORD_GATEWAY_CREDENZIALI.length());
- if(s.contains("@@")) {
- s = s.substring(s.indexOf("@@")+2);
- }
- return s;
- }
- else {
- return value;
- }
- }
- public static String readIdentitaGatewayCredenziali(String value) {
- if(value.startsWith(GestoreCredenzialiEngine.KEYWORD_GATEWAY_CREDENZIALI)) {
- String s = value.substring(GestoreCredenzialiEngine.KEYWORD_GATEWAY_CREDENZIALI.length());
- if(s.contains("@@")) {
- return s.substring(0,s.indexOf("@@"));
- }
- else {
- return null;
- }
- }
- else {
- return null;
- }
- }
-
- private String identita = null;
- private boolean portaApplicativa = false;
- private Context context;
- private RequestInfo requestInfo;
- public GestoreCredenzialiEngine(boolean portaApplicativa, Context context){
- this.portaApplicativa = portaApplicativa;
- this.context = context;
- if(this.context!=null && this.context.containsKey(Costanti.REQUEST_INFO)) {
- this.requestInfo = (RequestInfo) this.context.get(Costanti.REQUEST_INFO);
- }
- }
- private String getPrefixMessaggioAutenticazioneFallita(String auth) {
- return "Autenticazione "+auth+" del Gestore delle Credenziali '"+this.identita+ "' fallita, ";
- }
- private static final String NESSUN_TIPO_CREDENZIALI_TRASPORTO = "nessun tipo di credenziali (basic/ssl/principal) riscontrate nel trasporto";
- private static final String CREDENZIALI_PRESENTI_TRASPORTO = "credenziali presenti nel trasporto ";
-
- private String getConfigurazioneNonValidaPrefix(ModalitaAutenticazioneGestoreCredenziali modalita) {
- return "Configurazione del Gestore delle Credenziali non valida, con la modalità '"+modalita.getValore()+"' ";
- }
- private String getConfigurazioneNonValidaHeaderNonDefiniti(ModalitaAutenticazioneGestoreCredenziali modalita, String auth) {
- return getConfigurazioneNonValidaPrefix(modalita)+"devono essere definiti gli header http su cui veicolare le credenziali "+auth;
- }
- private String getConfigurazioneNonValidaHeaderNonDefinito(ModalitaAutenticazioneGestoreCredenziali modalita, String auth) {
- return getConfigurazioneNonValidaPrefix(modalita)+"deve essere definito un header http su cui veicolare le credenziali "+auth;
- }
- private String getConfigurazioneNonValidaAlmenoHeaderDefinito(ModalitaAutenticazioneGestoreCredenziali modalita, String auth) {
- return getConfigurazioneNonValidaPrefix(modalita)+"deve essere definito almeno un header http su cui veicolare le credenziali "+auth;
- }
-
- private String getMessaggioHeaderHttpNonPresente(String headerName) {
- return "Header HTTP '"+headerName+"' non presente";
- }
-
- private String getSuffixNonValido(Exception e) {
- return " non valido: "+e.getMessage();
- }
-
- private String getMessaggioCertificatoPresenteHeaderNonValido(String headerName, Exception t) {
- return "Certificato presente nell'header '"+headerName+"' non valido: "+t.getMessage();
- }
-
- public Credenziali elaborazioneCredenziali(
- IDSoggetto idSoggetto,
- InfoConnettoreIngresso infoConnettoreIngresso, OpenSPCoop2Message messaggio)
- throws GestoreCredenzialiException,
- GestoreCredenzialiConfigurationException {
-
- if(messaggio!=null) {
- // non usato
- }
-
- Map<String, List<String>> headerTrasporto = infoConnettoreIngresso.getUrlProtocolContext().getHeaders();
-
- Credenziali credenzialiTrasporto = infoConnettoreIngresso.getCredenziali();
-
- GestoreCredenzialiConfigurazione configurazione = GestoreCredenzialiConfigurazione.getConfigurazione(!this.portaApplicativa, idSoggetto);
-
- // Abilitato ?
- boolean enabled = (configurazione!=null) && configurazione.isEnabled();
- if(!enabled) {
- return credenzialiTrasporto; // credenziali originali
- }
-
- // Identita' Gateway
- this.identita=configurazione.getNome();
-
- // Realm
-
- String realm = configurazione.getRealm();
- String authType = configurazione.getAuthType();
-
-
- // AutenticazioneGateway
- TipoAutenticazioneGestoreCredenziali autenticazioneGateway = configurazione.getTipoAutenticazioneCanale();
- if(autenticazioneGateway==null){
- throw new GestoreCredenzialiException("Tipo di autenticazione per il gestore delle credenziali non definito");
- }
- if(TipoAutenticazioneGestoreCredenziali.BASIC.equals(autenticazioneGateway)){
- String usernameGateway = configurazione.getAutenticazioneCanaleBasicUsername();
- String passwordGateway = configurazione.getAutenticazioneCanaleBasicPassword();
- if(usernameGateway == null){
- throw new GestoreCredenzialiException("Richiesta autenticazione basic del gestore delle credenziali, ma username non definito");
- }
- if(passwordGateway == null){
- throw new GestoreCredenzialiException("Richiesta autenticazione basic del gestore delle credenziali, ma password non definito");
- }
- if(credenzialiTrasporto.getUsername()==null || credenzialiTrasporto.getPassword()==null){
- throw new GestoreCredenzialiConfigurationException(IntegrationFunctionError.PROXY_AUTHENTICATION_CREDENTIALS_NOT_FOUND,
- buildWWWProxyAuthBasic(authType, realm, true),
- getPrefixMessaggioAutenticazioneFallita(autenticazioneGateway.getValore())+"nessun tipo di credenziali basic riscontrata nel trasporto");
- }
- if( ! ( usernameGateway.equals(credenzialiTrasporto.getUsername()) && passwordGateway.equals(credenzialiTrasporto.getPassword()) ) ){
- String credenzialiPresenti = credenzialiTrasporto.toString();
- if(credenzialiPresenti==null || credenzialiPresenti.equals("")){
- throw new GestoreCredenzialiConfigurationException(IntegrationFunctionError.PROXY_AUTHENTICATION_INVALID_CREDENTIALS,
- buildWWWProxyAuthBasic(authType, realm, false),
- getPrefixMessaggioAutenticazioneFallita(autenticazioneGateway.getValore())+NESSUN_TIPO_CREDENZIALI_TRASPORTO);
- }else{
- throw new GestoreCredenzialiConfigurationException(IntegrationFunctionError.PROXY_AUTHENTICATION_INVALID_CREDENTIALS,
- buildWWWProxyAuthBasic(authType, realm, false),
- getPrefixMessaggioAutenticazioneFallita(autenticazioneGateway.getValore())+CREDENZIALI_PRESENTI_TRASPORTO+credenzialiPresenti);
- }
- }
- }
- else if(TipoAutenticazioneGestoreCredenziali.SSL.equals(autenticazioneGateway)){
- String subjectGateway = configurazione.getAutenticazioneCanaleSslSubject();
- if(subjectGateway == null){
- throw new GestoreCredenzialiException("Richiesta autenticazione ssl del gestore delle credenziali, ma subject non definito");
- }
- try{
- org.openspcoop2.utils.certificate.CertificateUtils.validaPrincipal(subjectGateway, PrincipalType.SUBJECT);
- }catch(Exception e){
- throw new GestoreCredenzialiException("Richiesta autenticazione ssl del gestore delle credenziali, ma subject fornito ["+subjectGateway+"] non valido: "+e.getMessage());
- }
- if(credenzialiTrasporto.getSubject()==null){
- throw new GestoreCredenzialiConfigurationException(IntegrationFunctionError.PROXY_AUTHENTICATION_CREDENTIALS_NOT_FOUND,
- buildWWWProxyAuthSSL(authType, realm, true),
- getPrefixMessaggioAutenticazioneFallita(autenticazioneGateway.getValore())+"nessun tipo di credenziali ssl riscontrata nel trasporto");
- }
- try{
- if( ! org.openspcoop2.utils.certificate.CertificateUtils.sslVerify(subjectGateway, credenzialiTrasporto.getSubject(), PrincipalType.SUBJECT, OpenSPCoop2Logger.getLoggerOpenSPCoopCore()) ){
- String credenzialiPresenti = credenzialiTrasporto.toString();
- if(credenzialiPresenti==null || credenzialiPresenti.equals("")){
- throw new GestoreCredenzialiConfigurationException(IntegrationFunctionError.PROXY_AUTHENTICATION_INVALID_CREDENTIALS,
- buildWWWProxyAuthSSL(authType, realm, false),
- getPrefixMessaggioAutenticazioneFallita(autenticazioneGateway.getValore())+NESSUN_TIPO_CREDENZIALI_TRASPORTO);
- }else{
- throw new GestoreCredenzialiConfigurationException(IntegrationFunctionError.PROXY_AUTHENTICATION_INVALID_CREDENTIALS,
- buildWWWProxyAuthSSL(authType, realm, false),
- getPrefixMessaggioAutenticazioneFallita(autenticazioneGateway.getValore())+CREDENZIALI_PRESENTI_TRASPORTO+credenzialiPresenti);
- }
- }
- }
- catch(GestoreCredenzialiConfigurationException ge) {
- throw ge;
- }
- catch(Exception e){
- throw new GestoreCredenzialiException("Richiesta autenticazione ssl del gateway gestore delle credenziali; errore durante la verifica: "+e.getMessage());
- }
- }
- else if(TipoAutenticazioneGestoreCredenziali.PRINCIPAL.equals(autenticazioneGateway)){
- String principalGateway = configurazione.getAutenticazioneCanalePrincipal();
- if(principalGateway == null){
- throw new GestoreCredenzialiException("Richiesta autenticazione principal del gestore delle credenziali, ma principal non definito");
- }
- if(credenzialiTrasporto.getPrincipal()==null){
- throw new GestoreCredenzialiConfigurationException(IntegrationFunctionError.PROXY_AUTHENTICATION_CREDENTIALS_NOT_FOUND,
- buildWWWProxyAuthPrincipal(authType, realm, true),
- getPrefixMessaggioAutenticazioneFallita(autenticazioneGateway.getValore())+"nessun tipo di credenziale principal riscontrata nel trasporto");
- }
- if( ! ( principalGateway.equals(credenzialiTrasporto.getPrincipal()) ) ){
- String credenzialiPresenti = credenzialiTrasporto.toString();
- if(credenzialiPresenti==null || credenzialiPresenti.equals("")){
- throw new GestoreCredenzialiConfigurationException(IntegrationFunctionError.PROXY_AUTHENTICATION_INVALID_CREDENTIALS,
- buildWWWProxyAuthPrincipal(authType, realm, false),
- getPrefixMessaggioAutenticazioneFallita(autenticazioneGateway.getValore())+NESSUN_TIPO_CREDENZIALI_TRASPORTO);
- }else{
- throw new GestoreCredenzialiConfigurationException(IntegrationFunctionError.PROXY_AUTHENTICATION_INVALID_CREDENTIALS,
- buildWWWProxyAuthPrincipal(authType, realm, false),
- getPrefixMessaggioAutenticazioneFallita(autenticazioneGateway.getValore())+CREDENZIALI_PRESENTI_TRASPORTO+credenzialiPresenti);
- }
- }
- }
-
-
- // Modalità di gestione
-
- ModalitaAutenticazioneGestoreCredenziali modalita = configurazione.getModalitaAutenticazioneCanale();
- String modalitaAtLeastOneErrorDescription = null;
- if(ModalitaAutenticazioneGestoreCredenziali.AT_LEAST_ONE.equals(modalita)) {
- modalitaAtLeastOneErrorDescription = configurazione.getModalitaAutenticazioneCanaleAtLeastOneErrorDescription();
- }
-
-
- // Avvio processo di lettura credenziali portate nell'header HTTP e generate in seguito all'autenticazione effettuata dal componente Gateway
-
- Credenziali c = new Credenziali();
-
- String headerNameBasicUsername = configurazione.getHeaderBasicUsername();
- String headerNameBasicPassword = configurazione.getHeaderBasicPassword();
- boolean verificaIdentitaBasic = headerNameBasicUsername!=null && headerNameBasicPassword!=null;
-
- String headerNameSSLSubject = configurazione.getHeaderSslSubject();
- String headerNameSSLIssuer = configurazione.getHeaderSslIssuer();
- String headerNameSSLCertificate = configurazione.getHeaderSslCertificate();
- KeyStore trustStoreCertificatiX509 = null;
- if(configurazione.getHeaderSslCertificateTrustStorePath()!=null) {
- try {
- trustStoreCertificatiX509 = GestoreKeystoreCaching.getMerlinTruststore(this.requestInfo, configurazione.getHeaderSslCertificateTrustStorePath(),
- configurazione.getHeaderSslCertificateTrustStoreType(),
- configurazione.getHeaderSslCertificateTrustStorePassword()).getTrustStore();
- }catch(Exception e){
- throw new GestoreCredenzialiException("Richiesta autenticazione ssl del gateway gestore delle credenziali; errore durante la lettura del truststore indicato ("+configurazione.getHeaderSslCertificateTrustStorePath()+"): "+e.getMessage());
- }
- }
- boolean trustStoreCertificatiX509CheckValid = configurazione.isHeaderSslCertificateTrustStoreCheckValid();
- CertStore trustStoreCertificatiX509Crls = null;
-
- IOCSPValidator ocspValidator = null;
- if(trustStoreCertificatiX509!=null) {
- boolean crlByOcsp = false;
- if(configurazione.getHeaderSslCertificateOcspPolicy()!=null) {
- LoggerBuffer lb = new LoggerBuffer();
- lb.setLogDebug(OpenSPCoop2Logger.getLoggerOpenSPCoopCore());
- lb.setLogError(OpenSPCoop2Logger.getLoggerOpenSPCoopCore());
- GestoreOCSPResource ocspResourceReader = new GestoreOCSPResource(this.requestInfo);
- try {
- ocspValidator = new GestoreOCSPValidator(this.requestInfo, lb,
- trustStoreCertificatiX509,
- configurazione.getHeaderSslCertificateCrlX509(),
- configurazione.getHeaderSslCertificateOcspPolicy(),
- ocspResourceReader);
- }catch(Exception e){
- throw new GestoreCredenzialiException("Richiesta autenticazione ssl del gateway gestore delle credenziali; errore durante l'inizializzazione del gestore della policy OCSP ("+configurazione.getHeaderSslCertificateOcspPolicy()+"): "+e.getMessage());
- }
- if(ocspValidator!=null) {
- GestoreOCSPValidator gOcspValidator = (GestoreOCSPValidator) ocspValidator;
- if(gOcspValidator.getOcspConfig()!=null) {
- crlByOcsp = gOcspValidator.getOcspConfig().isCrl();
- }
- }
- }
- if(configurazione.getHeaderSslCertificateCrlX509()!=null && !crlByOcsp) {
- try {
- trustStoreCertificatiX509Crls = GestoreKeystoreCaching.getCRLCertstore(this.requestInfo, configurazione.getHeaderSslCertificateCrlX509()).getCertStore();
- }catch(Exception e){
- throw new GestoreCredenzialiException("Richiesta autenticazione ssl del gateway gestore delle credenziali; errore durante la lettura delle CRLs ("+configurazione.getHeaderSslCertificateCrlX509()+"): "+e.getMessage());
- }
- }
- }
- boolean sslCertificateUrlDecode = false;
- boolean sslCertificateBase64Decode = false;
- boolean sslCertificateHexDecode = false;
- boolean sslCertificateUrlDecodeOrBase64Decode = false;
- boolean sslCertificateUrlDecodeOrBase64DecodeOrHexDecode = false;
- boolean sslCertificateEnrichBeginEnd = false;
- boolean sslCertificateReplace = false;
- String sslCertificateReplaceSource = null;
- String sslCertificateReplaceDest = null;
- String sslCertificateNoneOption = null;
- boolean sslCertificateIgnoreEmpty = false;
- if(headerNameSSLCertificate!=null) {
- sslCertificateUrlDecode = configurazione.isHeaderSslCertificateUrlDecode();
- sslCertificateBase64Decode = configurazione.isHeaderSslCertificateBase64Decode();
- sslCertificateHexDecode = configurazione.isHeaderSslCertificateHexDecode();
- sslCertificateUrlDecodeOrBase64Decode = configurazione.isHeaderSslCertificateUrlDecodeOrBase64Decode();
- sslCertificateUrlDecodeOrBase64DecodeOrHexDecode = configurazione.isHeaderSslCertificateUrlDecodeOrBase64DecodeOrHexDecode();
- sslCertificateEnrichBeginEnd = configurazione.isHeaderSslCertificateEnrichBeginEnd();
- sslCertificateReplace = configurazione.isHeaderSslCertificateReplaceCharacters();
- if(sslCertificateReplace) {
- sslCertificateReplaceSource = configurazione.getHeaderSslCertificateReplaceCharactersSource();
- sslCertificateReplaceDest = configurazione.getHeaderSslCertificateReplaceCharactersDest();
- }
- sslCertificateNoneOption = configurazione.getHeaderSslCertificateNoneOption();
- sslCertificateIgnoreEmpty = configurazione.isHeaderSslCertificateIgnoreEmpty();
- }
- boolean verificaIdentitaSSL = headerNameSSLSubject!=null || headerNameSSLCertificate!=null;
-
- String headerNamePrincipal = configurazione.getHeaderPrincipal();
- boolean verificaIdentitaPrincipal = headerNamePrincipal!=null;
-
- if(!verificaIdentitaBasic && !verificaIdentitaSSL && !verificaIdentitaPrincipal){
- return credenzialiTrasporto; // credenziali originali
- }
-
- boolean existsHeaderBasicUsername = false;
- boolean existsHeaderBasicPassword = false;
- if(verificaIdentitaBasic){
- existsHeaderBasicUsername = existsHeader(headerTrasporto, headerNameBasicUsername);
- existsHeaderBasicPassword = existsHeader(headerTrasporto, headerNameBasicPassword);
- }
- boolean existsHeaderSslSubject = false;
- boolean existsHeaderSslIssuer = false;
- boolean existsHeaderSslCertificate = false;
- if(verificaIdentitaSSL){
- existsHeaderSslSubject = existsHeader(headerTrasporto, headerNameSSLSubject);
- existsHeaderSslIssuer = existsHeader(headerTrasporto, headerNameSSLIssuer);
- existsHeaderSslCertificate = existsHeader(headerTrasporto, headerNameSSLCertificate);
- }
- boolean existsHeaderPrincipal = false;
- if(verificaIdentitaPrincipal){
- existsHeaderPrincipal = existsHeader(headerTrasporto, headerNamePrincipal);
- }
-
-
- // Interpretazione della modalità richiesta di gestione
- // Il Gestore può funzionare in modalità 'none' e quindi le richieste in arrivo possono anche non presentare alcun header che veicola le credenziali.
- // L'unico vincolo è che se vi sono delle credenziali devono essere valide (non vuote e corrette per ssl).
- // Il Gestore può inoltre essere configurato per richiedere almeno una credenziale o esattamente una credenziale di un certo tipo.
- // Con la modalità 'none' o 'atLeastOne' è possibile usare il gestore davanti a erogazioni/fruizioni con tipi di autenticazione differenti,
- // delegando poi alla singola erogazione o fruizione il controllo che le credenziali siano effetivamente presenti
- switch (modalita) {
- case NONE:
- if( (!existsHeaderBasicUsername || !existsHeaderBasicPassword) && !existsHeaderSslSubject && !existsHeaderSslCertificate && !existsHeaderPrincipal ){
- return credenzialiTrasporto; // credenziali originali poiche' non sono presenti header che indicano nuove credenziali.
- }
- break;
- case AT_LEAST_ONE:
- if( (!existsHeaderBasicUsername || !existsHeaderBasicPassword) && !existsHeaderSslSubject && !existsHeaderSslCertificate && !existsHeaderPrincipal ){
- StringBuilder sb = new StringBuilder();
- if(headerNameBasicUsername!=null) {
- sb.append(headerNameBasicUsername);
- }
- if(headerNameSSLSubject!=null) {
- if(sb.length()>0) {
- sb.append(",");
- }
- sb.append(headerNameSSLSubject);
- }
- if(headerNameSSLCertificate!=null) {
- if(sb.length()>0) {
- sb.append(",");
- }
- sb.append(headerNameSSLCertificate);
- }
- if(headerNamePrincipal!=null) {
- if(sb.length()>0) {
- sb.append(",");
- }
- sb.append(headerNamePrincipal);
- }
- throw new GestoreCredenzialiConfigurationException(IntegrationFunctionError.PROXY_AUTHENTICATION_FORWARDED_CREDENTIALS_NOT_FOUND,
- buildWWWProxyAuthAtleastOne(authType, realm,
- modalitaAtLeastOneErrorDescription),
- "Non sono presenti Header HTTP che veicolano credenziali (header non rilevati: "+sb.toString()+")");
- }
- break;
- case BASIC:
- if(!verificaIdentitaBasic){
- throw new GestoreCredenzialiException(getConfigurazioneNonValidaHeaderNonDefiniti(modalita, modalita.getValore()));
- }
- if( !existsHeaderBasicUsername ) {
- throw new GestoreCredenzialiConfigurationException(IntegrationFunctionError.PROXY_AUTHENTICATION_FORWARDED_CREDENTIALS_NOT_FOUND,
- buildWWWAuthBasic(),
- getMessaggioHeaderHttpNonPresente(headerNameBasicUsername));
- }
- if( !existsHeaderBasicPassword ) {
- throw new GestoreCredenzialiConfigurationException(IntegrationFunctionError.PROXY_AUTHENTICATION_FORWARDED_CREDENTIALS_NOT_FOUND,
- buildWWWAuthBasic(),
- getMessaggioHeaderHttpNonPresente(headerNameBasicPassword));
- }
- // il controllo che il valore presente negli header non sia vuoto viene fatto dopo.
- break;
- case SSL:
- if(!verificaIdentitaSSL){
- throw new GestoreCredenzialiException(getConfigurazioneNonValidaAlmenoHeaderDefinito(modalita, modalita.getValore()));
- }
- if(headerNameSSLSubject!=null && headerNameSSLCertificate!=null) {
- if(!existsHeaderSslSubject && !existsHeaderSslCertificate) {
- throw new GestoreCredenzialiConfigurationException(IntegrationFunctionError.PROXY_AUTHENTICATION_FORWARDED_CREDENTIALS_NOT_FOUND,
- buildWWWAuthSSL(),
- "Header HTTP '"+headerNameSSLSubject+"' o '"+headerNameSSLCertificate+"' non presente");
- }
- }
- else if( headerNameSSLSubject!=null) {
- if(!existsHeaderSslSubject) {
- throw new GestoreCredenzialiConfigurationException(IntegrationFunctionError.PROXY_AUTHENTICATION_FORWARDED_CREDENTIALS_NOT_FOUND,
- buildWWWAuthSSL(),
- getMessaggioHeaderHttpNonPresente(headerNameSSLSubject));
- }
- }
- else { /** per forza questo caso if( headerNameSSLCertificate!=null */
- if( !existsHeaderSslCertificate) {
- throw new GestoreCredenzialiConfigurationException(IntegrationFunctionError.PROXY_AUTHENTICATION_FORWARDED_CREDENTIALS_NOT_FOUND,
- buildWWWAuthSSL(),
- getMessaggioHeaderHttpNonPresente(headerNameSSLCertificate));
- }
- }
- // il controllo che il valore presente negli header non sia vuoto e/o corretto viene fatto dopo.
- break;
- case PRINCIPAL:
- if(!verificaIdentitaPrincipal){
- throw new GestoreCredenzialiException(getConfigurazioneNonValidaHeaderNonDefinito(modalita, modalita.getValore()));
- }
- if( !existsHeaderPrincipal) {
- throw new GestoreCredenzialiConfigurationException(IntegrationFunctionError.PROXY_AUTHENTICATION_FORWARDED_CREDENTIALS_NOT_FOUND,
- buildWWWAuthPrincipal(),
- getMessaggioHeaderHttpNonPresente(headerNamePrincipal));
- }
- // il controllo che il valore presente negli header non sia vuoto viene fatto dopo.
- break;
- default:
- break;
- }
-
-
- // Lettura credenziali Basic
- if(verificaIdentitaBasic &&
- existsHeaderBasicUsername &&
- existsHeaderBasicPassword ){
-
- String username = getProperty(headerTrasporto, headerNameBasicUsername );
- String password = getProperty(headerTrasporto, headerNameBasicPassword );
- if(username==null || "".equals(username)){
- throw new GestoreCredenzialiConfigurationException(IntegrationFunctionError.PROXY_AUTHENTICATION_FORWARDED_CREDENTIALS_NOT_FOUND,
- buildWWWAuthBasic(),
- "Username value non fornito nell'header del trasporto "+headerNameBasicUsername);
- }
- if(password==null || "".equals(password)){
- throw new GestoreCredenzialiConfigurationException(IntegrationFunctionError.PROXY_AUTHENTICATION_FORWARDED_CREDENTIALS_NOT_FOUND,
- buildWWWAuthBasic(),
- "Password value non fornito nell'header del trasporto "+headerNameBasicPassword);
- }
- c.setUsername(username);
- c.setPassword(password);
- }
-
- // Lettura credenziali ssl
- if(verificaIdentitaSSL) {
- if(existsHeaderSslSubject ){
-
- String subject = getProperty(headerTrasporto, headerNameSSLSubject );
- if(subject==null || "".equals(subject)){
- throw new GestoreCredenzialiConfigurationException(IntegrationFunctionError.PROXY_AUTHENTICATION_FORWARDED_CREDENTIALS_NOT_FOUND,
- buildWWWAuthSSL(),
- "Subject value non fornito nell'header del trasporto "+headerNameSSLSubject);
- }
- try{
- org.openspcoop2.utils.certificate.CertificateUtils.formatPrincipal(subject, PrincipalType.SUBJECT);
- /** Non posso validare, verra' fornito un certificato nel formato RFC 2253 o RFC 1779
- Sicuramente puo' contenere sia il carattere '/' che ',' ma uno dei due sara' escaped tramite il formato richiesto.
- org.openspcoop.utils.Utilities.validaSubject(subject);*/
- }catch(Exception e){
- throw new GestoreCredenzialiException("Subject value fornito nell'header del trasporto "+headerNameSSLSubject+getSuffixNonValido(e),e);
- }
- c.setSubject(subject);
- }
- if(existsHeaderSslIssuer ){
-
- String issuer = getProperty(headerTrasporto, headerNameSSLIssuer );
- if(issuer==null || "".equals(issuer)){
- throw new GestoreCredenzialiConfigurationException(IntegrationFunctionError.PROXY_AUTHENTICATION_FORWARDED_CREDENTIALS_NOT_FOUND,
- buildWWWAuthSSL(),
- "Issuer value non fornito nell'header del trasporto "+headerNameSSLIssuer);
- }
- try{
- org.openspcoop2.utils.certificate.CertificateUtils.formatPrincipal(issuer, PrincipalType.ISSUER);
- /**Non posso validare, verra' fornito un certificato nel formato RFC 2253 o RFC 1779
- Sicuramente puo' contenere sia il carattere '/' che ',' ma uno dei due sara' escaped tramite il formato richiesto.
- org.openspcoop.utils.Utilities.validaSubject(subject);*/
- }catch(Exception e){
- throw new GestoreCredenzialiException("Issuer value fornito nell'header del trasporto "+headerNameSSLIssuer+getSuffixNonValido(e),e);
- }
- c.setIssuer(issuer);
- }
- if(existsHeaderSslCertificate ){
-
- String certificate = getProperty(headerTrasporto, headerNameSSLCertificate );
-
- if(certificate!=null &&
- (
- (sslCertificateNoneOption!=null && sslCertificateNoneOption.equals(certificate))
- ||
- (StringUtils.isEmpty(certificate) && sslCertificateIgnoreEmpty)
- )
- ){
- c.setCertificate(null);
- c.setSubject(null);
- c.setIssuer(null);
- SecurityToken securityToken = SecurityTokenUtilities.readSecurityToken(this.context);
- if(securityToken!=null) {
- securityToken.setChannel(null); // sovrascrivo eventuali esistente
- }
- }
- else {
-
- if(certificate==null || "".equals(certificate)){
- throw new GestoreCredenzialiConfigurationException(IntegrationFunctionError.PROXY_AUTHENTICATION_FORWARDED_CREDENTIALS_NOT_FOUND,
- buildWWWAuthSSL(),
- "Certificate non fornito nell'header del trasporto "+headerNameSSLCertificate);
- }
-
-
- CertificateDecodeConfig config = new CertificateDecodeConfig();
- config.setUrlDecode(sslCertificateUrlDecode);
- config.setBase64Decode(sslCertificateBase64Decode);
- config.setHexDecode(sslCertificateHexDecode);
- config.setUrlDecodeOrBase64Decode(sslCertificateUrlDecodeOrBase64Decode);
- config.setUrlDecodeOrBase64DecodeOrHexDecode(sslCertificateUrlDecodeOrBase64DecodeOrHexDecode);
- config.setEnrichPEMBeginEnd(sslCertificateEnrichBeginEnd);
- config.setReplace(sslCertificateReplace);
- if(sslCertificateReplace) {
- if(sslCertificateReplaceSource!=null && !StringUtils.isEmpty(sslCertificateReplaceSource)) {
- config.setReplaceSource(sslCertificateReplaceSource);
- }
- if(sslCertificateReplaceDest!=null && !StringUtils.isEmpty(sslCertificateReplaceDest)) {
- config.setReplaceDest(sslCertificateReplaceDest);
- }
- }
-
- Certificate cer = null;
- try{
- cer = CertificateUtils.readCertificate(config, certificate);
- c.setCertificate(cer);
-
- String subject = c.getCertificate().getCertificate().getSubject().toString();
- String issuer = c.getCertificate().getCertificate().getIssuer().toString();
- c.setSubject(subject);
- c.setIssuer(issuer);
-
- }catch(Exception e){
- throw new GestoreCredenzialiConfigurationException(IntegrationFunctionError.PROXY_AUTHENTICATION_FORWARDED_CREDENTIALS_NOT_FOUND,
- buildWWWAuthSSL(),
- "Certificate fornito nell'header del trasporto "+headerNameSSLCertificate+getSuffixNonValido(e), e);
- }
-
- if(cer!=null && trustStoreCertificatiX509!=null) {
- if(!cer.getCertificate().isVerified(trustStoreCertificatiX509, true)) {
- throw new GestoreCredenzialiConfigurationException(IntegrationFunctionError.PROXY_AUTHENTICATION_FORWARDED_CREDENTIALS_NOT_FOUND,
- buildWWWAuthSSL(),
- "Certificato presente nell'header '"+headerNameSSLCertificate+"' non è verificabile rispetto alle CA conosciute");
- }
- if(trustStoreCertificatiX509Crls!=null) {
- try {
- cer.getCertificate().checkValid(trustStoreCertificatiX509Crls, trustStoreCertificatiX509);
- }catch(Exception t) {
- throw new GestoreCredenzialiConfigurationException(IntegrationFunctionError.PROXY_AUTHENTICATION_FORWARDED_CREDENTIALS_NOT_FOUND,
- buildWWWAuthSSL(),
- getMessaggioCertificatoPresenteHeaderNonValido(headerNameSSLCertificate,t));
- }
- }
- else if(trustStoreCertificatiX509CheckValid){
- try {
- cer.getCertificate().checkValid();
- }catch(Exception t) {
- throw new GestoreCredenzialiConfigurationException(IntegrationFunctionError.PROXY_AUTHENTICATION_FORWARDED_CREDENTIALS_NOT_FOUND,
- buildWWWAuthSSL(),
- getMessaggioCertificatoPresenteHeaderNonValido(headerNameSSLCertificate,t));
- }
- }
- if(ocspValidator!=null) {
- try {
- ocspValidator.valid(cer.getCertificate().getCertificate());
- }catch(Exception t) {
- throw new GestoreCredenzialiConfigurationException(IntegrationFunctionError.PROXY_AUTHENTICATION_FORWARDED_CREDENTIALS_NOT_FOUND,
- buildWWWAuthSSL(),
- getMessaggioCertificatoPresenteHeaderNonValido(headerNameSSLCertificate,t));
- }
- }
- }
-
- /* --------------- SecurityToken --------------- */
- try {
- if(cer!=null && this.context!=null) {
- SecurityToken securityToken = SecurityTokenUtilities.newSecurityToken(this.context);
- ChannelSecurityToken channelSecurityToken = new ChannelSecurityToken();
- channelSecurityToken.setCertificate(cer.getCertificate());
- securityToken.setChannel(channelSecurityToken); // sovrascrivo eventuali esistente
- }
- }catch(Exception e){
- throw new GestoreCredenzialiException("Costruzione SecurityToken non riuscita: "+e.getMessage(),e);
- }
- }
- }
- }
-
- // Lettura credenziali principal
- if(verificaIdentitaPrincipal &&
- existsHeaderPrincipal ){
-
- String principal = getProperty(headerTrasporto, headerNamePrincipal );
- if(principal==null || "".equals(principal)){
- throw new GestoreCredenzialiConfigurationException(IntegrationFunctionError.PROXY_AUTHENTICATION_FORWARDED_CREDENTIALS_NOT_FOUND,
- buildWWWAuthPrincipal(),
- "Principal value non fornito nell'header del trasporto "+headerNamePrincipal);
- }
- c.setPrincipal(principal);
- }
-
- return c;
-
- }
-
- public String getIdentitaGestoreCredenziali(){
- return this.identita;
- }
-
- private boolean existsHeader(Map<String, List<String>> properties, String name){
- if(properties!=null){
- return TransportUtils.containsKey(properties, name);
- }else{
- return false;
- }
- }
-
- private String getProperty(Map<String, List<String>> properties, String name){
- if(properties!=null){
- return TransportUtils.getFirstValue(properties, name);
- }else{
- return null;
- }
-
- }
-
- public static String buildWWWProxyAuthBasic(String authType, String realm, boolean missing) {
- if(realm==null || "".equals(realm) || authType==null || "".equals(authType)) {
- return null;
- }
- WWWAuthenticateConfig configGW = OpenSPCoop2Properties.getInstance().getRealmAutenticazioneBasicWWWAuthenticateConfig();
- WWWAuthenticateConfig proxy = configGW!=null ? (WWWAuthenticateConfig) configGW.clone() : new WWWAuthenticateConfig();
- proxy.setRealm(realm);
- proxy.setAuthType(authType);
- return missing ? proxy.buildWWWAuthenticateHeaderValue_notFound() : proxy.buildWWWAuthenticateHeaderValue_invalid();
- }
- public static String buildWWWProxyAuthSSL(String authType, String realm, boolean missing) {
- if(realm==null || "".equals(realm) || authType==null || "".equals(authType)) {
- return null;
- }
- WWWAuthenticateConfig configGW = OpenSPCoop2Properties.getInstance().getRealmAutenticazioneHttpsWWWAuthenticateConfig();
- WWWAuthenticateConfig proxy = configGW!=null ? (WWWAuthenticateConfig) configGW.clone() : new WWWAuthenticateConfig();
- proxy.setRealm(realm);
- proxy.setAuthType(authType);
- return missing ? proxy.buildWWWAuthenticateHeaderValue_notFound() : proxy.buildWWWAuthenticateHeaderValue_invalid();
- }
- public static String buildWWWProxyAuthPrincipal(String authType, String realm, boolean missing) {
- if(realm==null || "".equals(realm) || authType==null || "".equals(authType)) {
- return null;
- }
- WWWAuthenticateConfig configGW = OpenSPCoop2Properties.getInstance().getRealmAutenticazionePrincipalWWWAuthenticateConfig(TipoAutenticazionePrincipal.CONTAINER);
- WWWAuthenticateConfig proxy = configGW!=null ? (WWWAuthenticateConfig) configGW.clone() : new WWWAuthenticateConfig();
- proxy.setRealm(realm);
- proxy.setAuthType(authType);
- return missing ? proxy.buildWWWAuthenticateHeaderValue_notFound() : proxy.buildWWWAuthenticateHeaderValue_invalid();
- }
- public static String buildWWWProxyAuthAtleastOne(String authType, String realm, String errorDescription) {
- if(realm==null || "".equals(realm) || authType==null || "".equals(authType)) {
- return null;
- }
- if(errorDescription!=null && !"".equals(errorDescription)) {
- return WWWAuthenticateGenerator.buildCustomHeaderValue(authType, realm, WWWAuthenticateErrorCode.invalid_request,
- errorDescription);
- }
- else {
- WWWAuthenticateErrorCode errorCode = null;
- return WWWAuthenticateGenerator.buildCustomHeaderValue(authType, realm, errorCode, null);
- }
- }
-
- public static String buildWWWAuthBasic() {
- WWWAuthenticateConfig config = OpenSPCoop2Properties.getInstance().getRealmAutenticazioneBasicWWWAuthenticateConfig();
- if(config!=null) {
- return config.buildWWWAuthenticateHeaderValue_notFound();
- }
- return null;
- }
- public static String buildWWWAuthSSL() {
- WWWAuthenticateConfig config = OpenSPCoop2Properties.getInstance().getRealmAutenticazioneHttpsWWWAuthenticateConfig();
- if(config!=null) {
- return config.buildWWWAuthenticateHeaderValue_notFound();
- }
- return null;
- }
- public static String buildWWWAuthPrincipal() {
- WWWAuthenticateConfig config = OpenSPCoop2Properties.getInstance().getRealmAutenticazionePrincipalWWWAuthenticateConfig(TipoAutenticazionePrincipal.CONTAINER);
- if(config!=null) {
- return config.buildWWWAuthenticateHeaderValue_notFound();
- }
- return null;
- }
- }