Hay una opción de configuración FIPSMode
en el APR Lifecycle Listener de Tomcat , que Parece que cumpliría tus requisitos. Como se observa en este hilo StackOverflow muy similar , y en la documentación de Tomcat / APR Lifecycle Listener, realmente se trata del modo operativo de OpenSSL. no Tomcat.
En una nota no relacionada, Tomcat no tiene certificación FIPS, debido al costo, el tiempo y la burocracia involucrados en la certificación FIPS, sin embargo, hay algunas ofertas comerciales que han probado a Tomcat con proveedores JSSE compatibles con FIPS , que pueden ser suficientes para sus propósitos. Además, Oracle y IBM ambos proporcionan documentación sobre habilitación El modo FIPS / el cumplimiento de los JSSE que proporcionan, por lo que puede no ser necesario utilizar una oferta de terceros, nuevamente, dependiendo de sus requisitos.
En la pregunta específica sobre el generador de ID de sesión de Tomcat, ya que es de código abierto, podemos verificar, y parece que el generador de ID de sesión de Tomcat utiliza la biblioteca SecureRandom de Java, que " cumple con las [...] pruebas estadísticas generadoras de números aleatorios especificadas en FIPS 140-2, Requisitos de seguridad para módulos criptográficos, sección 4.9.1. "
public class SessionIdGenerator {
/**
* Generate and return a new session identifier.
*/
public String generateSessionId() {
byte random[] = new byte[16];
// Render the result as a String of hexadecimal digits
StringBuilder buffer = new StringBuilder();
int resultLenBytes = 0;
while (resultLenBytes < sessionIdLength) {
getRandomBytes(random);
for (int j = 0; j < random.length && resultLenBytes < sessionIdLength; j++) {
byte b1 = (byte) ((random[j] & 0xf0) >> 4);
byte b2 = (byte) (random[j] & 0x0f);
if (b1 < 10) buffer.append((char) ('0' + b1));
else buffer.append((char) ('A' + (b1 - 10)));
if (b2 < 10) buffer.append((char) ('0' + b2));
else buffer.append((char) ('A' + (b2 - 10)));
resultLenBytes++;
}
}
if (jvmRoute != null && jvmRoute.length() > 0) {
buffer.append('.').append(jvmRoute);
}
return buffer.toString();
}
/**
*
*/
private void getRandomBytes(byte bytes[]) {
SecureRandom random = randoms.poll();
if (random == null) {
random = createSecureRandom();
}
random.nextBytes(bytes);
randoms.add(random);
}
/**
* Create a new random number generator instance we should use for
* generating session identifiers.
*/
private SecureRandom createSecureRandom() {
SecureRandom result = null;
long t1 = System.currentTimeMillis();
if (secureRandomClass != null) {
try {
// Construct and seed a new random number generator
Class<?> clazz = Class.forName(secureRandomClass);
result = (SecureRandom) clazz.newInstance();
} catch (Exception e) {
log.error(sm.getString("sessionIdGenerator.random",
secureRandomClass), e);
}
}
if (result == null) {
// No secureRandomClass or creation failed. Use SecureRandom.
try {
if (secureRandomProvider != null &&
secureRandomProvider.length() > 0) {
result = SecureRandom.getInstance(secureRandomAlgorithm,
secureRandomProvider);
} else if (secureRandomAlgorithm != null &&
secureRandomAlgorithm.length() > 0) {
result = SecureRandom.getInstance(secureRandomAlgorithm);
}
} catch (NoSuchAlgorithmException e) {
log.error(sm.getString("sessionIdGenerator.randomAlgorithm",
secureRandomAlgorithm), e);
} catch (NoSuchProviderException e) {
log.error(sm.getString("sessionIdGenerator.randomProvider",
secureRandomProvider), e);
}
}
if (result == null) {
// Invalid provider / algorithm
try {
result = SecureRandom.getInstance("SHA1PRNG");
} catch (NoSuchAlgorithmException e) {
log.error(sm.getString("sessionIdGenerator.randomAlgorithm",
secureRandomAlgorithm), e);
}
}
if (result == null) {
// Nothing works - use platform default
result = new SecureRandom();
}
// Force seeding to take place
result.nextInt();
long t2 = System.currentTimeMillis();
if ((t2 - t1) > 100)
log.info(sm.getString("sessionIdGenerator.createRandom",
result.getAlgorithm(), Long.valueOf(t2 - t1)));
return result;
}
}