Skip to content

Commit

Permalink
[GovWayCore]
Browse files Browse the repository at this point in the history
È stata aggiunta un'opzione che permette di disabilitare, su singola erogazione o fruizione, il controllo della validità (scadenza) del certificato X.509 utilizzato per firmare un token.
Questo consente di accettare token firmati con certificati scaduti.
È stata inoltre introdotta una configurazione che permette di eseguire la verifica della validità del certificato di firma solo se il certificato non è presente nel truststore utilizzato per la validazione
(ad esempio, quando nel truststore è presente solo la CA).
Con questa impostazione, un certificato scaduto verrà accettato se è presente nel truststore; in caso contrario, la transazione verrà rifiutata.
  • Loading branch information
andreapoli committed Sep 26, 2024
1 parent a84bcb1 commit 312389b
Show file tree
Hide file tree
Showing 22 changed files with 1,628 additions and 116 deletions.
12 changes: 11 additions & 1 deletion ChangeLog
Original file line number Diff line number Diff line change
@@ -1,9 +1,19 @@
2024-09-26 Andrea Poli <[email protected]>

* [GovWayCore]
Aggiunta funzionalità #1525
È stata aggiunta un'opzione che permette di disabilitare, su singola erogazione o fruizione, il controllo della validità (scadenza) del certificato X.509 utilizzato per firmare un token.
Questo consente di accettare token firmati con certificati scaduti.
È stata inoltre introdotta una configurazione che permette di eseguire la verifica della validità del certificato di firma solo se il certificato non è presente nel truststore utilizzato per la validazione
(ad esempio, quando nel truststore è presente solo la CA).
Con questa impostazione, un certificato scaduto verrà accettato se è presente nel truststore; in caso contrario, la transazione verrà rifiutata.

2024-09-25 Andrea Poli <[email protected]>

* [GovWayConsole]
La maschera di caricamento di un certificato in un applicativo o in un soggetto è stata rivista per rendere più chiaro cosa comporta disabilitare la verifica del certificato.

2024-09-26 Andrea Poli <[email protected]>
2024-09-25 Andrea Poli <[email protected]>

* [GovWayCore, GovWayMonito]
Risolto Bug #1524
Expand Down
12 changes: 12 additions & 0 deletions core/deploy/properties/govway.properties
Original file line number Diff line number Diff line change
Expand Up @@ -4037,6 +4037,12 @@ org.openspcoop2.pdd.gestioneToken.exp.checkEnabled=true
# È inoltre possibile fornire un intervallo di tolleranza in millisecondi
org.openspcoop2.pdd.gestioneToken.exp.toleranceMilliseconds=0

# Indicazione se debba essere effettuata o meno il controllo di validità del certificato di firma x509 del token
# - true (default)
# - false
# - ifNotInTruststore: la validazione viene effettuata solamente se nel truststore non è presente il certificato ma solamente la ca.
org.openspcoop2.pdd.gestioneToken.validityCheck=true

# Il token salvato nella transazione ed utilizzato per i controlli (XACMLPolicy/TokenOptions/...)
# è il risultato della normalizzazione delle informazioni ottenute da più fonti (JWT, Introspection, UserInfo).
# E' possibile salvare anche i json originali ottenuti dalle varie fonti abilitando la seguente opzione
Expand Down Expand Up @@ -4309,6 +4315,12 @@ org.openspcoop2.pdd.gestioneAttributeAuthority.saveSourceAttributeResponseInfo=t
# Indicazione se gli attributi devono essere registrati sulla base dati
org.openspcoop2.pdd.gestioneAttributeAuthority.transazioniRegistrazioneAttributiInformazioniNormalizzate=true

# Indicazione se debba essere effettuata o meno il controllo di validità del certificato di firma x509 del token jwt ricevuto in risposta
# - true (default)
# - false
# - ifNotInTruststore: la validazione viene effettuata solamente se nel truststore non è presente il certificato ma solamente la ca.
org.openspcoop2.pdd.gestioneAttributeAuthority.validityCheck=true




Expand Down
59 changes: 59 additions & 0 deletions core/src/org/openspcoop2/pdd/config/CostantiProprieta.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
import org.openspcoop2.utils.BooleanNullable;
import org.openspcoop2.utils.certificate.KeystoreType;
import org.openspcoop2.utils.resources.Charset;
import org.openspcoop2.utils.security.CertificateValidityCheck;
import org.openspcoop2.utils.transport.http.RFC2047Encoding;

/**
Expand Down Expand Up @@ -157,6 +158,64 @@ private CostantiProprieta() {}




// **** TOKEN VALIDATION *****

public static final String TOKEN_VALIDATION_VALUE_ENABLED = CertificateValidityCheck.CONFIG_VALUE_ENABLED;
public static final String TOKEN_VALIDATION_VALUE_DISABLED = CertificateValidityCheck.CONFIG_VALUE_DISABLED;
public static final String TOKEN_VALIDATION_VALUE_IF_NOT_IN_TRUSTSTORE = CertificateValidityCheck.CONFIG_VALUE_IF_NOT_IN_TRUSTSTORE;

public static final String TOKEN_VALIDATION_VALIDITY_CHECK = "tokenValidation.validityCheck";

public static CertificateValidityCheck getTokenValidationCertificateValidityCheck(List<Proprieta> proprieta, CertificateValidityCheck defaultValue) {
String v = readValue(proprieta, TOKEN_VALIDATION_VALIDITY_CHECK);
if(v!=null && !StringUtils.isEmpty(v)){
v=v.trim();
CertificateValidityCheck c = CertificateValidityCheck.parseCertificateValidityCheck(v);
if(c!=null) {
return c;
}
}
return defaultValue;
}









// **** ATTRIBUTE AUTHORITY *****

public static final String ATTRIBUTE_AUTHORITY_VALUE_ENABLED = CertificateValidityCheck.CONFIG_VALUE_ENABLED;
public static final String ATTRIBUTE_AUTHORITY_VALUE_DISABLED = CertificateValidityCheck.CONFIG_VALUE_DISABLED;
public static final String ATTRIBUTE_AUTHORITY_VALUE_IF_NOT_IN_TRUSTSTORE = CertificateValidityCheck.CONFIG_VALUE_IF_NOT_IN_TRUSTSTORE;

public static final String ATTRIBUTE_AUTHORITY_VALIDITY_CHECK = "attributeAuthority.validityCheck";


public static CertificateValidityCheck getAttributeAuthorityCertificateValidityCheck(List<Proprieta> proprieta, CertificateValidityCheck defaultValue) {
String v = readValue(proprieta, ATTRIBUTE_AUTHORITY_VALIDITY_CHECK);
if(v!=null && !StringUtils.isEmpty(v)){
v=v.trim();
CertificateValidityCheck c = CertificateValidityCheck.parseCertificateValidityCheck(v);
if(c!=null) {
return c;
}
}
return defaultValue;
}









// **** AUTENTICAZIONE HTTPS *****

public static final String AUTENTICAZIONE_VALUE_ENABLED = VALUE_ENABLED;
Expand Down
107 changes: 83 additions & 24 deletions core/src/org/openspcoop2/pdd/config/OpenSPCoop2Properties.java
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@
import org.openspcoop2.utils.resources.Charset;
import org.openspcoop2.utils.resources.FileSystemUtilities;
import org.openspcoop2.utils.resources.Loader;
import org.openspcoop2.utils.security.CertificateValidityCheck;
import org.openspcoop2.utils.sql.ISQLQueryObject;
import org.openspcoop2.utils.transport.http.HttpConstants;
import org.openspcoop2.utils.transport.http.RFC2047Encoding;
Expand Down Expand Up @@ -2200,6 +2201,7 @@ else if( !CostantiConfigurazione.CONFIGURAZIONE_DB.equalsIgnoreCase(getTipoConfi
this.getGestioneTokenIatTimeCheckFutureToleranceMilliseconds();
this.isGestioneTokenExpTimeCheck();
this.getGestioneTokenExpTimeCheckToleranceMilliseconds();
this.getGestioneTokenValidityCheck();
this.isGestioneTokenSaveSourceTokenInfo();
this.isGestioneTokenSaveTokenInfoValidationFailed();
this.isGestioneTokenSaveTokenInfoValidationFailedExcludeJwtSignature();
Expand Down Expand Up @@ -2249,10 +2251,11 @@ else if( !CostantiConfigurazione.CONFIGURAZIONE_DB.equalsIgnoreCase(getTipoConfi
this.initGestioneRetrieveTokenCacheKey();

// Gestione AttributeAuthority
this.isGestioneAttributeAuthority_debug();
this.isGestioneAttributeAuthorityDebug();
this.getGestioneAttributeAuthorityLockPermits();
this.isGestioneAttributeAuthority_saveSourceAttributeResponseInfo();
this.isGestioneAttributeAuthority_transazioniRegistrazioneAttributiInformazioniNormalizzate();
this.isGestioneAttributeAuthoritySaveSourceAttributeResponseInfo();
this.isGestioneAttributeAuthorityTransazioniRegistrazioneAttributiInformazioniNormalizzate();
this.getGestioneAttributeAuthorityValidityCheck();

// Statistiche via jmx Console
this.isStatisticheViaJmx();
Expand Down Expand Up @@ -23385,6 +23388,34 @@ public Long getGestioneTokenExpTimeCheckToleranceMilliseconds() throws CoreExcep
return this.getGestioneTokenExpTimeCheckToleranceMilliseconds;
}

private CertificateValidityCheck getGestioneTokenValidityCheck = null;
public CertificateValidityCheck getGestioneTokenValidityCheck(){

String pName = "org.openspcoop2.pdd.gestioneToken.validityCheck";
if(this.getGestioneTokenValidityCheck==null){
try{
String value = this.reader.getValueConvertEnvProperties(pName);

if (value != null){
value = value.trim();
this.getGestioneTokenValidityCheck = CertificateValidityCheck.parseCertificateValidityCheck(value);
if(this.getGestioneTokenValidityCheck==null) {
throw new CoreException("Opzione '"+value+"' sconosciuta");
}
}else{
this.logWarn(getMessaggioProprietaNonImpostata(pName, true));
this.getGestioneTokenValidityCheck = CertificateValidityCheck.ENABLED;
}

}catch(java.lang.Exception e) {
this.logWarn(getMessaggioProprietaNonImpostata(pName, e, true),e);
this.getGestioneTokenValidityCheck = CertificateValidityCheck.ENABLED;
}
}

return this.getGestioneTokenValidityCheck;
}

private Boolean isGestioneTokenSaveSourceTokenInfo = null;
public boolean isGestioneTokenSaveSourceTokenInfo(){

Expand Down Expand Up @@ -24647,29 +24678,29 @@ public boolean isGestioneRetrieveTokenCacheKey(String tipo) {

/* ------------- Gestione Attribute Authority ---------------------*/

private Boolean isGestioneAttributeAuthority_debug = null;
public boolean isGestioneAttributeAuthority_debug(){
private Boolean isGestioneAttributeAuthorityDebug = null;
public boolean isGestioneAttributeAuthorityDebug(){

String pName = "org.openspcoop2.pdd.gestioneAttributeAuthority.debug";
if(this.isGestioneAttributeAuthority_debug==null){
if(this.isGestioneAttributeAuthorityDebug==null){
try{
String value = this.reader.getValueConvertEnvProperties(pName);

if (value != null){
value = value.trim();
this.isGestioneAttributeAuthority_debug = Boolean.parseBoolean(value);
this.isGestioneAttributeAuthorityDebug = Boolean.parseBoolean(value);
}else{
this.logWarn(getMessaggioProprietaNonImpostata(pName, false));
this.isGestioneAttributeAuthority_debug = false;
this.isGestioneAttributeAuthorityDebug = false;
}

}catch(java.lang.Exception e) {
this.logWarn(getMessaggioProprietaNonImpostata(pName, e, false),e);
this.isGestioneAttributeAuthority_debug = false;
this.isGestioneAttributeAuthorityDebug = false;
}
}

return this.isGestioneAttributeAuthority_debug;
return this.isGestioneAttributeAuthorityDebug;
}

private Boolean getGestioneAttributeAuthorityLockPermitsRead = null;
Expand Down Expand Up @@ -24701,54 +24732,82 @@ public Integer getGestioneAttributeAuthorityLockPermits() {
return this.getGestioneAttributeAuthorityLockPermits;
}

private Boolean isGestioneAttributeAuthority_saveSourceAttributeResponseInfo = null;
public boolean isGestioneAttributeAuthority_saveSourceAttributeResponseInfo(){
private Boolean isGestioneAttributeAuthoritySaveSourceAttributeResponseInfo = null;
public boolean isGestioneAttributeAuthoritySaveSourceAttributeResponseInfo(){

String pName = "org.openspcoop2.pdd.gestioneAttributeAuthority.saveSourceAttributeResponseInfo";
if(this.isGestioneAttributeAuthority_saveSourceAttributeResponseInfo==null){
if(this.isGestioneAttributeAuthoritySaveSourceAttributeResponseInfo==null){
try{
String value = this.reader.getValueConvertEnvProperties(pName);

if (value != null){
value = value.trim();
this.isGestioneAttributeAuthority_saveSourceAttributeResponseInfo = Boolean.parseBoolean(value);
this.isGestioneAttributeAuthoritySaveSourceAttributeResponseInfo = Boolean.parseBoolean(value);
}else{
this.logWarn(getMessaggioProprietaNonImpostata(pName, false));
this.isGestioneAttributeAuthority_saveSourceAttributeResponseInfo = false;
this.isGestioneAttributeAuthoritySaveSourceAttributeResponseInfo = false;
}

}catch(java.lang.Exception e) {
this.logWarn(getMessaggioProprietaNonImpostata(pName, e, false),e);
this.isGestioneAttributeAuthority_saveSourceAttributeResponseInfo = false;
this.isGestioneAttributeAuthoritySaveSourceAttributeResponseInfo = false;
}
}

return this.isGestioneAttributeAuthority_saveSourceAttributeResponseInfo;
return this.isGestioneAttributeAuthoritySaveSourceAttributeResponseInfo;
}

private Boolean isGestioneAttributeAuthority_transazioniRegistrazioneAttributiInformazioniNormalizzate = null;
public boolean isGestioneAttributeAuthority_transazioniRegistrazioneAttributiInformazioniNormalizzate(){
private Boolean isGestioneAttributeAuthorityTransazioniRegistrazioneAttributiInformazioniNormalizzate = null;
public boolean isGestioneAttributeAuthorityTransazioniRegistrazioneAttributiInformazioniNormalizzate(){

String pName = "org.openspcoop2.pdd.gestioneAttributeAuthority.transazioniRegistrazioneAttributiInformazioniNormalizzate";
if(this.isGestioneAttributeAuthority_transazioniRegistrazioneAttributiInformazioniNormalizzate==null){
if(this.isGestioneAttributeAuthorityTransazioniRegistrazioneAttributiInformazioniNormalizzate==null){
try{
String value = this.reader.getValueConvertEnvProperties(pName);

if (value != null){
value = value.trim();
this.isGestioneAttributeAuthority_transazioniRegistrazioneAttributiInformazioniNormalizzate = Boolean.parseBoolean(value);
this.isGestioneAttributeAuthorityTransazioniRegistrazioneAttributiInformazioniNormalizzate = Boolean.parseBoolean(value);
}else{
this.logWarn(getMessaggioProprietaNonImpostata(pName, false));
this.isGestioneAttributeAuthority_transazioniRegistrazioneAttributiInformazioniNormalizzate = false;
this.isGestioneAttributeAuthorityTransazioniRegistrazioneAttributiInformazioniNormalizzate = false;
}

}catch(java.lang.Exception e) {
this.logWarn(getMessaggioProprietaNonImpostata(pName, e, false),e);
this.isGestioneAttributeAuthority_transazioniRegistrazioneAttributiInformazioniNormalizzate = false;
this.isGestioneAttributeAuthorityTransazioniRegistrazioneAttributiInformazioniNormalizzate = false;
}
}

return this.isGestioneAttributeAuthorityTransazioniRegistrazioneAttributiInformazioniNormalizzate;
}

private CertificateValidityCheck getGestioneAttributeAuthorityValidityCheck = null;
public CertificateValidityCheck getGestioneAttributeAuthorityValidityCheck(){

String pName = "org.openspcoop2.pdd.gestioneAttributeAuthority.validityCheck";
if(this.getGestioneAttributeAuthorityValidityCheck==null){
try{
String value = this.reader.getValueConvertEnvProperties(pName);

if (value != null){
value = value.trim();
this.getGestioneAttributeAuthorityValidityCheck = CertificateValidityCheck.parseCertificateValidityCheck(value);
if(this.getGestioneAttributeAuthorityValidityCheck==null) {
throw new CoreException("Opzione '"+value+"' sconosciuta");
}
}else{
this.logWarn(getMessaggioProprietaNonImpostata(pName, true));
this.getGestioneAttributeAuthorityValidityCheck = CertificateValidityCheck.ENABLED;
}

}catch(java.lang.Exception e) {
this.logWarn(getMessaggioProprietaNonImpostata(pName, e, true),e);
this.getGestioneAttributeAuthorityValidityCheck = CertificateValidityCheck.ENABLED;
}
}

return this.isGestioneAttributeAuthority_transazioniRegistrazioneAttributiInformazioniNormalizzate;
return this.getGestioneAttributeAuthorityValidityCheck;
}


Expand Down
2 changes: 1 addition & 1 deletion core/src/org/openspcoop2/pdd/core/token/GestoreToken.java
Original file line number Diff line number Diff line change
Expand Up @@ -2342,7 +2342,7 @@ public static InformazioniAttributi normalizeInformazioniAttributi(List<Informaz
return list.get(0);
}
else {
return new InformazioniAttributi(OpenSPCoop2Properties.getInstance().isGestioneAttributeAuthority_saveSourceAttributeResponseInfo(), list.toArray(new InformazioniAttributi[1]));
return new InformazioniAttributi(OpenSPCoop2Properties.getInstance().isGestioneAttributeAuthoritySaveSourceAttributeResponseInfo(), list.toArray(new InformazioniAttributi[1]));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import org.openspcoop2.core.config.InvocazioneCredenziali;
import org.openspcoop2.core.config.PortaApplicativa;
import org.openspcoop2.core.config.PortaDelegata;
import org.openspcoop2.core.config.Proprieta;
import org.openspcoop2.core.config.ResponseCachingConfigurazione;
import org.openspcoop2.core.config.constants.CostantiConfigurazione;
import org.openspcoop2.core.config.constants.StatoFunzionalita;
Expand All @@ -57,6 +58,7 @@
import org.openspcoop2.message.constants.MessageType;
import org.openspcoop2.message.constants.ServiceBinding;
import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
import org.openspcoop2.pdd.config.CostantiProprieta;
import org.openspcoop2.pdd.config.ForwardProxy;
import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
import org.openspcoop2.pdd.core.PdDContext;
Expand Down Expand Up @@ -107,6 +109,7 @@
import org.openspcoop2.utils.io.Base64Utilities;
import org.openspcoop2.utils.json.JSONUtils;
import org.openspcoop2.utils.properties.PropertiesUtilities;
import org.openspcoop2.utils.security.CertificateValidityCheck;
import org.openspcoop2.utils.security.JOSESerialization;
import org.openspcoop2.utils.security.JWSOptions;
import org.openspcoop2.utils.security.JWTOptions;
Expand Down Expand Up @@ -229,6 +232,17 @@ static EsitoRecuperoAttributi readAttributes(Logger log, PolicyAttributeAuthorit
java.security.KeyStore keystore = (java.security.KeyStore) oKeystore;
jsonCompactVerify = new JsonVerifySignature(keystore, options);

CertificateValidityCheck validityCheck = OpenSPCoop2Properties.getInstance().getGestioneAttributeAuthorityValidityCheck();
List<Proprieta> proprieta = null;
if(pa!=null) {
proprieta = pa.getProprietaList();
}
else if(pd!=null) {
proprieta = pd.getProprietaList();
}
validityCheck = CostantiProprieta.getAttributeAuthorityCertificateValidityCheck(proprieta, validityCheck);
jsonCompactVerify.setValidityCheck(validityCheck);

String signatureOCSP = policyAttributeAuthority.getResponseJwsOcspPolicy();
String signatureCRL = policyAttributeAuthority.getResponseJwsCrl();

Expand Down Expand Up @@ -818,7 +832,7 @@ private static HttpResponse http(Logger log, PolicyAttributeAuthority policyAttr
connettoreMsg.setConnectorProperties(new java.util.HashMap<>());
connettoreMsg.getConnectorProperties().put(CostantiConnettori.CONNETTORE_LOCATION, endpoint);
OpenSPCoop2Properties properties = OpenSPCoop2Properties.getInstance();
boolean debug = properties.isGestioneAttributeAuthority_debug();
boolean debug = properties.isGestioneAttributeAuthorityDebug();
if(debug) {
connettoreMsg.getConnectorProperties().put(CostantiConnettori.CONNETTORE_DEBUG, true+"");
}
Expand Down
Loading

0 comments on commit 312389b

Please sign in to comment.