SSLConfig.java

/*
 * GovWay - A customizable API Gateway 
 * https://govway.org
 * 
 * Copyright (c) 2005-2024 Link.it srl (https://link.it). 
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 3, as published by
 * the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */


package org.openspcoop2.utils.transport.http;

import java.io.Serializable;
import java.security.KeyStore;
import java.security.cert.CertStore;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.openspcoop2.utils.LoggerBuffer;
import org.slf4j.Logger;


/**
 * SSLConfig
 *
 * @author Poli Andrea (apoli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class SSLConfig implements Serializable  {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	// AUTENTICAZIONE SERVER:
	// TrustAllCerts
	private boolean trustAllCerts = false;
	// TrustStore
	private transient KeyStore trustStore;
	private transient boolean trustStoreHsm;
	// Path del trustStore che contiene il certificato del server.
	private String trustStoreLocation;
	// Password del trustStore che contiene il certificato del server.
	private String trustStorePassword;
	// the standard name of the requested trust management algorithm
	private String trustManagementAlgorithm;
	// tipo del truststore
	private String trustStoreType;
	// CRLs
	private String trustStoreCRLsLocation;
	// CertStore
	private transient CertStore trustStoreCRLs;
	// OCSP Policy
	private String trustStoreOCSPPolicy;
	
	
	// AUTENTICAZIONE CLIENT:
	// KeyStore
	private transient KeyStore keyStore;
	private transient boolean keyStoreHsm;
	// Path del keyStore che contiene il certificato del client e la chiave privata del client.
	private String keyStoreLocation;
	// Password del keyStore che contiene il certificato del client
	private String keyStorePassword;
	// Alias della chiave privata
	private String keyAlias;
	// Password della chiave privata
	private String keyPassword;
	// the standard name of the requested key management algorithm
	private String keyManagementAlgorithm;
	// tipo del keystore
	private String keyStoreType;
	// BYOK Policy
	private String keyStoreBYOKPolicy;

	// HostName verifier
	private boolean hostnameVerifier = true;
	// Eventuale classe da utilizzare per effettuare hostnameVerifier al posto di quella di default
	private String classNameHostnameVerifier;
	
	// TipologiaSSL
	private String sslType= null;
	
	// Use Secure Random
	private boolean secureRandomSet = false;
	private boolean secureRandom = false;
	private String secureRandomAlgorithm = null;
	
	// Utilities
	private StringBuilder sbError;
	private StringBuilder sbDebug;
	private transient Logger logger;
	
	// Dynamic Map
	private Map<String,Object> dynamicMap;
	
	@Override
	public String toString() {
		return this.toString(false);
	}
	public String toString(boolean includePassword) {
		StringBuilder sb = new StringBuilder();
		
		sb.append("sslType=").append(this.sslType);
		sb.append(" ");
		
		sb.append("secureRandom=").append(this.secureRandom);
		sb.append(" ");
		if(this.secureRandomAlgorithm!=null) {
			sb.append("secureRandomAlgorithm=").append(this.secureRandomAlgorithm);
			sb.append(" ");
		}
		
		sb.append("hostnameVerifier=").append(this.hostnameVerifier);
		sb.append(" ");
		if(this.classNameHostnameVerifier!=null) {
			sb.append("classNameHostnameVerifier=").append(this.classNameHostnameVerifier);
			sb.append(" ");
		}
		
		sb.append("trustAllCerts=").append(this.trustAllCerts);
		sb.append(" ");
		if(!this.trustAllCerts) {
			sb.append("trustStoreLocation=").append(this.trustStoreLocation);
			sb.append(" ");
			sb.append("trustStoreType=").append(this.trustStoreType);
			sb.append(" ");
			sb.append("trustStorePassword=").append(includePassword? this.trustStorePassword : hidePassword(this.trustStorePassword) );
			sb.append(" ");
			sb.append("trustManagementAlgorithm=").append(this.trustManagementAlgorithm);
			sb.append(" ");
			sb.append("trustStoreCRLsLocation=").append(this.trustStoreCRLsLocation);
			sb.append(" ");
			sb.append("trustStoreOCSPPolicy=").append(this.trustStoreOCSPPolicy);
			sb.append(" ");
		}
		else if(this.trustStoreOCSPPolicy!=null && StringUtils.isNotEmpty(this.trustStoreOCSPPolicy)){
			sb.append("trustStoreCRLsLocation=").append(this.trustStoreCRLsLocation);
			sb.append(" ");
			sb.append("trustStoreOCSPPolicy=").append(this.trustStoreOCSPPolicy);
			sb.append(" ");
		}
		
		if(this.keyStoreLocation!=null) {
			sb.append("keyStoreLocation=").append(this.keyStoreLocation);
			sb.append(" ");
			sb.append("keyStoreType=").append(this.keyStoreType);
			sb.append(" ");
			sb.append("keyStorePassword=").append(includePassword? this.keyStorePassword : hidePassword(this.keyStorePassword) );
			sb.append(" ");
			sb.append("keyStoreBYOKPolicy=").append(this.keyStoreBYOKPolicy);
			sb.append(" ");
			sb.append("keyAlias=").append(this.keyAlias);
			sb.append(" ");
			sb.append("keyPassword=").append(includePassword? this.keyPassword : hidePassword(this.keyPassword) );
			sb.append(" ");
			sb.append("keyManagementAlgorithm=").append(this.keyManagementAlgorithm);
			sb.append(" ");
		}
		else {
			sb.append("keyStore=disabled");
			sb.append(" ");
		}
		
		return sb.toString();
	}
	private String hidePassword(String value) {
		return (value!=null) ? "***" : "unset" ;
	}

	public boolean isTrustAllCerts() {
		return this.trustAllCerts;
	}

	public void setTrustAllCerts(boolean trustAllCerts) {
		this.trustAllCerts = trustAllCerts;
	}
	
	public KeyStore getTrustStore() {
		return this.trustStore;
	}
	public boolean isTrustStoreHsm() {
		return this.trustStoreHsm;
	}

	public void setTrustStore(KeyStore trustStore) {
		this.setTrustStore(trustStore, false);
	}
	public void setTrustStore(KeyStore trustStore, boolean hsm) {
		this.trustStore = trustStore;
		this.trustStoreHsm = hsm;
	}

	public KeyStore getKeyStore() {
		return this.keyStore;
	}
	public boolean isKeyStoreHsm() {
		return this.keyStoreHsm;
	}

	public void setKeyStore(KeyStore keyStore) {
		this.setKeyStore(keyStore, false);
	}
	public void setKeyStore(KeyStore keyStore, boolean hsm) {
		this.keyStore = keyStore;
		this.keyStoreHsm = hsm;
	}
	
	public String getTrustStoreLocation() {
		return this.trustStoreLocation;
	}

	public void setTrustStoreLocation(String trustStoreLocation) {
		this.trustStoreLocation = trustStoreLocation;
	}

	public String getTrustStorePassword() {
		return this.trustStorePassword;
	}

	public void setTrustStorePassword(String trustStorePassword) {
		this.trustStorePassword = trustStorePassword;
	}

	public String getTrustManagementAlgorithm() {
		return this.trustManagementAlgorithm;
	}

	public void setTrustManagementAlgorithm(String trustManagementAlgorithm) {
		this.trustManagementAlgorithm = trustManagementAlgorithm;
	}

	public String getTrustStoreType() {
		return this.trustStoreType;
	}

	public void setTrustStoreType(String trustStoreType) {
		this.trustStoreType = trustStoreType;
	}
	
	public String getTrustStoreCRLsLocation() {
		return this.trustStoreCRLsLocation;
	}

	public void setTrustStoreCRLsLocation(String trustStoreCRLsLocation) {
		this.trustStoreCRLsLocation = trustStoreCRLsLocation;
	}

	public CertStore getTrustStoreCRLs() {
		return this.trustStoreCRLs;
	}

	public void setTrustStoreCRLs(CertStore trustStoreCRLs) {
		this.trustStoreCRLs = trustStoreCRLs;
	}

	public String getTrustStoreOCSPPolicy() {
		return this.trustStoreOCSPPolicy;
	}
	public void setTrustStoreOCSPPolicy(String trustStoreOCSPPolicy) {
		this.trustStoreOCSPPolicy = trustStoreOCSPPolicy;
	}
	
	public String getKeyStoreLocation() {
		return this.keyStoreLocation;
	}

	public void setKeyStoreLocation(String keyStoreLocation) {
		this.keyStoreLocation = keyStoreLocation;
	}

	public String getKeyStorePassword() {
		return this.keyStorePassword;
	}

	public void setKeyStorePassword(String keyStorePassword) {
		this.keyStorePassword = keyStorePassword;
	}

	public String getKeyAlias() {
		return this.keyAlias;
	}

	public void setKeyAlias(String keyAlias) {
		this.keyAlias = keyAlias;
	}
	
	public String getKeyPassword() {
		return this.keyPassword;
	}

	public void setKeyPassword(String keyPassword) {
		this.keyPassword = keyPassword;
	}

	public String getKeyManagementAlgorithm() {
		return this.keyManagementAlgorithm;
	}

	public void setKeyManagementAlgorithm(String keyManagementAlgorithm) {
		this.keyManagementAlgorithm = keyManagementAlgorithm;
	}

	public String getKeyStoreType() {
		return this.keyStoreType;
	}

	public void setKeyStoreType(String keyStoreType) {
		this.keyStoreType = keyStoreType;
	}

	public String getKeyStoreBYOKPolicy() {
		return this.keyStoreBYOKPolicy;
	}
	
	public void setKeyStoreBYOKPolicy(String keyStoreBYOKPolicy) {
		this.keyStoreBYOKPolicy = keyStoreBYOKPolicy;
	}
	
	public boolean isHostnameVerifier() {
		return this.hostnameVerifier;
	}

	public void setHostnameVerifier(boolean hostnameVerifier) {
		this.hostnameVerifier = hostnameVerifier;
	}

	public String getClassNameHostnameVerifier() {
		return this.classNameHostnameVerifier;
	}

	public void setClassNameHostnameVerifier(String classNameHostnameVerifier) {
		this.classNameHostnameVerifier = classNameHostnameVerifier;
	}

	public String getSslType() {
		return this.sslType;
	}

	public void setSslType(String sslType) {
		this.sslType = sslType;
	}
	
	public boolean isSecureRandom() {
		return this.secureRandom;
	}

	public void setSecureRandom(boolean secureRandom) {
		this.secureRandom = secureRandom;
		this.secureRandomSet = true;
	}

	public boolean isSecureRandomSet() {
		return this.secureRandomSet;
	}

	public String getSecureRandomAlgorithm() {
		return this.secureRandomAlgorithm;
	}

	public void setSecureRandomAlgorithm(String secureRandomAlgorithm) {
		this.secureRandomAlgorithm = secureRandomAlgorithm;
	}
	
	public StringBuilder getSbError() {
		return this.sbError;
	}

	public void setSbError(StringBuilder sbError) {
		this.sbError = sbError;
	}

	public StringBuilder getSbDebug() {
		return this.sbDebug;
	}

	public void setSbDebug(StringBuilder sbDebug) {
		this.sbDebug = sbDebug;
	}
	
	public void setLogger(Logger logger) {
		this.logger = logger;
	}
	
	public LoggerBuffer getLoggerBuffer() {
		LoggerBuffer lb = new LoggerBuffer();
		lb.setSbDebug(this.sbDebug);
		lb.setSbError(this.sbError);
		lb.setLogErrorInDebug(true);
		return lb;
	}
	public LoggerBuffer getLog4jBuffer() {
		LoggerBuffer lb = new LoggerBuffer();
		lb.setLogError(this.logger);
		if(this.sbDebug!=null) {
			lb.setLogDebug(this.logger);
		}
		return lb;
	}
	
	public Map<String, Object> getDynamicMap() {
		return this.dynamicMap;
	}
	public void setDynamicMap(Map<String, Object> dynamicMap) {
		this.dynamicMap = dynamicMap;
	}
}