Changes to allow for the setup of trust relationships with ATSs.
This commit is contained in:
@@ -65,6 +65,8 @@ public final class SecureTokenUtil
|
||||
//
|
||||
// The map key has the format: "IssuerDN=certissuername SN=certserialnumber"
|
||||
private Map<String,X509Certificate> m_x509ISNCertMap;
|
||||
private Date m_x509ISNCertMapRefreshDate;
|
||||
private int m_x509ISNCertMapRefreshInterval = 360; // seconds
|
||||
|
||||
// SecureToken template
|
||||
private static final String m_secureTokenTemplate =
|
||||
@@ -93,6 +95,90 @@ public final class SecureTokenUtil
|
||||
*/
|
||||
public SecureTokenUtil(boolean serverMode) throws Exception
|
||||
{
|
||||
// Start by creating the trusted ATS Cert Map
|
||||
m_x509ISNCertMap = createTrustedAtsCertMap();
|
||||
m_x509ISNCertMapRefreshDate = new Date();
|
||||
m_x509ISNCertMapRefreshDate.setTime(m_x509ISNCertMapRefreshDate.getTime() + (m_x509ISNCertMapRefreshInterval * 1000));
|
||||
|
||||
// Obtain the signing key and certificate if we are in server mode
|
||||
if (serverMode)
|
||||
{
|
||||
InputStream inStream = null;
|
||||
try
|
||||
{
|
||||
// Load our crypto properties
|
||||
Properties cryptoProperties = new Properties();
|
||||
ClassLoader classLoader = SecureTokenUtil.class.getClassLoader();
|
||||
inStream = classLoader.getResourceAsStream("casa_crypto.properties");
|
||||
cryptoProperties.load(inStream);
|
||||
|
||||
// Get necessary keystore info from the crypto properties
|
||||
String keystoreType = cryptoProperties.getProperty("com.novell.casa.authtoksvc.crypto.keystore.type", "jks");
|
||||
String keystoreFile = cryptoProperties.getProperty("com.novell.casa.authtoksvc.crypto.keystore.file");
|
||||
String keystorePass = cryptoProperties.getProperty("com.novell.casa.authtoksvc.crypto.keystore.password");
|
||||
if (keystoreType == null
|
||||
|| keystoreFile == null
|
||||
|| keystorePass == null)
|
||||
{
|
||||
m_log.error("Constructor()- Missing crypto configuration");
|
||||
throw new Exception("SecureTokenUtil()- Missing crypto configuration");
|
||||
}
|
||||
|
||||
// Instantiate and load the keystore
|
||||
KeyStore keyStore = KeyStore.getInstance(keystoreType);
|
||||
FileInputStream fis = new FileInputStream(keystoreFile);
|
||||
keyStore.load(fis, keystorePass.toCharArray());
|
||||
|
||||
// Get signing key and cert if in server mode
|
||||
if (serverMode)
|
||||
{
|
||||
String privateKeyAlias = cryptoProperties.getProperty("com.novell.casa.authtoksvc.crypto.keystore.alias");
|
||||
String privateKeyPass = cryptoProperties.getProperty("com.novell.casa.authtoksvc.crypto.alias.password");
|
||||
String certificateAlias = cryptoProperties.getProperty("com.novell.casa.authtoksvc.crypto.keystore.alias");
|
||||
if (privateKeyAlias == null
|
||||
|| privateKeyPass == null
|
||||
|| certificateAlias == null)
|
||||
{
|
||||
m_log.error("Constructor()- Missing crypto configuration");
|
||||
throw new Exception("SecureTokenUtil()- Missing crypto configuration");
|
||||
}
|
||||
|
||||
// Get the key that will be used for signing tokens
|
||||
m_signingKey = (PrivateKey) keyStore.getKey(privateKeyAlias,
|
||||
privateKeyPass.toCharArray());
|
||||
if (m_signingKey == null)
|
||||
{
|
||||
m_log.error("Constructor()- Signing key not found in keystore");
|
||||
throw new Exception("SecureTokenUtil()- Signing key not found in keystore");
|
||||
}
|
||||
|
||||
// Get the signing certificate
|
||||
m_signingCert = (X509Certificate) keyStore.getCertificate(certificateAlias);
|
||||
if (m_signingCert == null)
|
||||
{
|
||||
m_log.error("Constructor()- Signing cert not found in keystore");
|
||||
throw new Exception("SecureTokenUtil()- Signing cert not found in keystore");
|
||||
}
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
// Make sure that the input stream has been closed
|
||||
if (inStream != null)
|
||||
inStream.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Static Create Trusted ATS Certificate Map.
|
||||
* <p/>
|
||||
* @return Trusted ATS Certificate Map
|
||||
* @throws Exception
|
||||
*/
|
||||
private static Map<String,X509Certificate> createTrustedAtsCertMap() throws Exception
|
||||
{
|
||||
Map<String,X509Certificate> x509ISNCertMap;
|
||||
InputStream inStream = null;
|
||||
try
|
||||
{
|
||||
@@ -104,14 +190,14 @@ public final class SecureTokenUtil
|
||||
|
||||
// Get necessary keystore info from the crypto properties
|
||||
String keystoreType = cryptoProperties.getProperty("com.novell.casa.authtoksvc.crypto.keystore.type", "jks");
|
||||
String keystoreFile = cryptoProperties.getProperty("com.novell.casa.authtoksvc.crypto.file");
|
||||
String keystorePass = cryptoProperties.getProperty("com.novell.casa.authtoksvc.crypto.keystore.password");
|
||||
String keystoreFile = cryptoProperties.getProperty("com.novell.casa.authtoksvc.crypto.trusted_ats_keystore.file");
|
||||
String keystorePass = cryptoProperties.getProperty("com.novell.casa.authtoksvc.crypto.trusted_ats_keystore.password");
|
||||
if (keystoreType == null
|
||||
|| keystoreFile == null
|
||||
|| keystorePass == null)
|
||||
{
|
||||
m_log.error("Constructor()- Missing crypto configuration");
|
||||
throw new Exception("SecureTokenUtil()- Missing crypto configuration");
|
||||
m_log.error("SecureTokenUtil.createTrustedAtsCertMap()- Missing crypto configuration");
|
||||
throw new Exception("SecureTokenUtil.createTrustedAtsCertMap()- Missing crypto configuration");
|
||||
}
|
||||
|
||||
// Instantiate and load the keystore
|
||||
@@ -119,40 +205,8 @@ public final class SecureTokenUtil
|
||||
FileInputStream fis = new FileInputStream(keystoreFile);
|
||||
keyStore.load(fis, keystorePass.toCharArray());
|
||||
|
||||
// Get signing key and cert if in server mode
|
||||
if (serverMode)
|
||||
{
|
||||
String privateKeyAlias = cryptoProperties.getProperty("com.novell.casa.authtoksvc.crypto.keystore.alias");
|
||||
String privateKeyPass = cryptoProperties.getProperty("com.novell.casa.authtoksvc.crypto.alias.password");
|
||||
String certificateAlias = cryptoProperties.getProperty("com.novell.casa.authtoksvc.crypto.keystore.alias");
|
||||
if (privateKeyAlias == null
|
||||
|| privateKeyPass == null
|
||||
|| certificateAlias == null)
|
||||
{
|
||||
m_log.error("Constructor()- Missing crypto configuration");
|
||||
throw new Exception("SecureTokenUtil()- Missing crypto configuration");
|
||||
}
|
||||
|
||||
// Get the key that will be used for signing tokens
|
||||
m_signingKey = (PrivateKey) keyStore.getKey(privateKeyAlias,
|
||||
privateKeyPass.toCharArray());
|
||||
if (m_signingKey == null)
|
||||
{
|
||||
m_log.error("Constructor()- Signing key not found in keystore");
|
||||
throw new Exception("SecureTokenUtil()- Signing key not found in keystore");
|
||||
}
|
||||
|
||||
// Get the signing certificate
|
||||
m_signingCert = (X509Certificate) keyStore.getCertificate(certificateAlias);
|
||||
if (m_signingCert == null)
|
||||
{
|
||||
m_log.error("Constructor()- Signing cert not found in keystore");
|
||||
throw new Exception("SecureTokenUtil()- Signing cert not found in keystore");
|
||||
}
|
||||
}
|
||||
|
||||
// Create the Certificate issuer:sn map
|
||||
m_x509ISNCertMap = new HashMap<String,X509Certificate>();
|
||||
x509ISNCertMap = new HashMap<String,X509Certificate>();
|
||||
Enumeration<String> aliases = keyStore.aliases();
|
||||
while (aliases.hasMoreElements())
|
||||
{
|
||||
@@ -160,7 +214,7 @@ public final class SecureTokenUtil
|
||||
if (cert != null)
|
||||
{
|
||||
// Add this certificate to our map
|
||||
m_x509ISNCertMap.put("IssuerDN=" + cert.getIssuerDN().getName() + " SN=" + cert.getSerialNumber().toString(), cert);
|
||||
x509ISNCertMap.put("IssuerDN=" + cert.getIssuerDN().getName() + " SN=" + cert.getSerialNumber().toString(), cert);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -170,6 +224,36 @@ public final class SecureTokenUtil
|
||||
if (inStream != null)
|
||||
inStream.close();
|
||||
}
|
||||
|
||||
return x509ISNCertMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check Trusted ATS Certificate Map.
|
||||
*/
|
||||
private synchronized Map<String,X509Certificate> checkTrustedAtsCertMap()
|
||||
{
|
||||
// Check if we need to refresh the trusted ATS Cert map
|
||||
Date currDate = new Date();
|
||||
if (currDate.compareTo(m_x509ISNCertMapRefreshDate) > 0)
|
||||
{
|
||||
// It is time to update the trusted ATS certificate map
|
||||
try
|
||||
{
|
||||
// Set up the next refresh date
|
||||
m_x509ISNCertMapRefreshDate.setTime(currDate.getTime() + (m_x509ISNCertMapRefreshInterval * 1000));
|
||||
|
||||
// Re-create the trusted ATS certificate map
|
||||
Map<String,X509Certificate> newX509ISNCertMap = createTrustedAtsCertMap();
|
||||
m_x509ISNCertMap = newX509ISNCertMap;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.error("SecureTokenUtil.checkTrustedAtsCertMap()- Exception caught, msg = " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
return m_x509ISNCertMap;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -181,7 +265,8 @@ public final class SecureTokenUtil
|
||||
*/
|
||||
private X509Certificate getCertWithX509IssuerSerialData(String issuerName, String serialNumber)
|
||||
{
|
||||
return m_x509ISNCertMap.get("IssuerDN=" + issuerName + " SN=" + serialNumber);
|
||||
Map<String,X509Certificate> x509ISNCertMap = checkTrustedAtsCertMap();
|
||||
return x509ISNCertMap.get("IssuerDN=" + issuerName + " SN=" + serialNumber);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user