Conformidad con FIPS
Babel Licensing se ejecuta en hosts Linux en modo FIPS, y su validación de licencias no depende de ningún algoritmo que FIPS no permita. Esta página explica cómo se comporta la biblioteca en esos hosts, un problema de inicio que puede encontrar en los contenedores y cómo resolverlo.
Contexto
Muchos clientes despliegan en hosts cuyo sistema operativo se ejecuta en
modo FIPS; en Linux esto se expone como
/proc/sys/crypto/fips_enabled = 1. En este modo se espera que el
proveedor criptográfico de la plataforma (OpenSSL en Linux) atienda
todas las operaciones criptográficas mediante un módulo FIPS certificado.
Un problema habitual aparece cuando un contenedor hereda el indicador FIPS del host pero su imagen base no incluye un proveedor FIPS de OpenSSL certificado. OpenSSL 3 intenta entonces entrar en modo FIPS, no consigue cargar el módulo del proveedor FIPS y queda en un estado defectuoso en el que fallan todas las operaciones de resumen y de cifrado, no solo las que FIPS normalmente no permitiría. El error típico es:
Interop+Crypto+OpenSslCryptographicException:
error:03000086:digital envelope routines::initialization errorSe trata de una condición del entorno, no de un defecto de Babel
Licensing. Está documentada con independencia de Babel: consulte
dotnet/dotnet-docker#5849
y dotnet/runtime#87884 .
Afecta a cualquier criptografía de .NET basada en OpenSSL dentro del
proceso, incluido TLS (HttpClient, gRPC), y no solo a la validación de
licencias.
Cómo puede manifestarse durante la validación de licencias
Como toda la capa de OpenSSL queda inutilizable, el fallo aparece en la primera operación criptográfica que se realiza en el inicio. Cuando una licencia tiene fecha de caducidad, Babel Licensing abre un pequeño almacén local que usa para el seguimiento de la caducidad y para detectar el retroceso del reloj. En las versiones modernas de .NET, la inicialización del almacén calcula un hash de identidad mediante el proveedor de la plataforma, que produce una excepción en un host con FIPS defectuoso. El fallo se notifica como:
Babel.Licensing.BabelLicenseException: Internal error
---> ...OpenSslCryptographicException: error:03000086:...Refuerzo (Babel Licensing 11.7.x y posteriores). El almacén de licencias se ha rediseñado para que una pila criptográfica de la plataforma defectuosa ya no interrumpa la validación de licencias: el almacén recurre de forma transparente a una implementación totalmente administrada, y la validación de licencias se degrada de forma controlada en lugar de fallar. En los hosts que funcionan correctamente el comportamiento no cambia. En las compilaciones anteriores, aplique la corrección del entorno descrita más abajo.
Resolución en los contenedores
Haga que OpenSSL pueda usarse dentro del contenedor. Cualquiera de las dos opciones resuelve el síntoma de la validación de licencias y todas las demás operaciones de su proceso basadas en OpenSSL.
Opción 1: no entrar automáticamente en modo FIPS en el contenedor
En las imágenes de .NET basadas en Ubuntu, OpenSSL respeta la variable
de entorno OPENSSL_FORCE_FIPS_MODE. Establézcala en 0 para que
OpenSSL no intente entrar en modo FIPS con un proveedor que la imagen no
incluye.
En docker-compose.yml, añádala al entorno del servicio licensing:
environment:
# Do not auto-enter FIPS mode using a provider the image doesn't ship
OPENSSL_FORCE_FIPS_MODE: 0o en un Dockerfile:
ENV OPENSSL_FORCE_FIPS_MODE=0Use esta opción cuando el contenedor en sí no necesita estar validado para FIPS: el host sigue en modo FIPS y solo el OpenSSL de este contenedor deja de seguir la ruta defectuosa de entrada automática en FIPS.
Opción 2: usar una imagen base con un proveedor FIPS certificado
Si se exige la conformidad con FIPS dentro del contenedor, use una imagen base que incluya un proveedor FIPS validado, para que la capa criptográfica se inicialice correctamente en lugar de fallar:
- imágenes de .NET de Azure Linux 3.0
(
mcr.microsoft.com/dotnet/aspnet:8.0-azurelinux3.0y similares), que incluyen SymCrypt, el proveedor de Microsoft certificado para FIPS, - imágenes de .NET basadas en Red Hat UBI 9
(
registry.access.redhat.com/ubi9/dotnet-90y similares), o - Ubuntu Pro con los paquetes de OpenSSL certificados para FIPS.
Babel Licensing Service en hosts en modo FIPS
El Babel Licensing Service se ejecuta en hosts en modo FIPS siempre que la imagen incluya realmente un módulo de proveedor FIPS. El flujo de trabajo de licencias completo se ha verificado en Azure Linux 3.0, cuyas imágenes de .NET incluyen SymCrypt, el proveedor de Microsoft certificado para FIPS, con FIPS aplicado de forma obligatoria:
- el servicio se inicia y valida su propia licencia,
- se crean plantillas de licencia y licencias firmadas con RSA,
- los clientes activan y validan licencias mediante gRPC,
- la vinculación al equipo, los tokens de activación, las señales de actividad y la desactivación funcionan.
Qué ocurre cuando falta el módulo FIPS
La distinción que importa no es «FIPS activado o desactivado», sino si está presente el módulo de proveedor que el modo FIPS requiere.
OpenSSL 3 no implementa los algoritmos por sí mismo: los carga desde
proveedores en forma de complementos. En modo FIPS la configuración
exige que todos los algoritmos procedan del proveedor FIPS certificado
(el módulo fips.so). Si ese módulo no está instalado en la imagen,
como ocurre en las imágenes de .NET estándar de Debian y Ubuntu, OpenSSL
no puede atender ninguna solicitud, de modo que fallan todos los
algoritmos, incluidos los que el propio FIPS permite.
Como .NET en Linux delega toda la criptografía en OpenSSL, esto afecta a algo más que a los hashes y los cifrados:
| Operación de .NET | Resultado cuando falta fips.so |
|---|---|
SHA256 / SHA1 | error:03000086 ...initialization error |
Aes | error:0308010C ...unsupported |
RandomNumberGenerator | error:12000090 ...unable to fetch drbg |
Como falla incluso la generación de números aleatorios, una aplicación ASP.NET Core no puede iniciarse en absoluto en un host así, porque necesita aleatoriedad durante el inicio (claves de protección de datos, TLS). Esto afecta a todas las aplicaciones ASP.NET Core, no solo al Babel Licensing Service, y es un error de configuración del entorno: se exige FIPS a una imagen que no puede proporcionarlo. Resuélvalo con la opción 1 o la opción 2 descritas más arriba.
Comprobar el entorno
Una comprobación rápida desde dentro del contenedor indica si OpenSSL funciona correctamente:
# Fails on a broken-FIPS host, succeeds once fixed
echo test | openssl dgst -sha1- Un fallo con
error:03000086(o un mensaje que indica quefips.sono se puede cargar): OpenSSL está en el estado defectuoso; aplique la opción 1 o la 2. - Una línea normal
SHA1(stdin)= ...: OpenSSL funciona correctamente y Babel Licensing se ejecuta con normalidad.
Incluso con el refuerzo de la validación de licencias, se recomienda corregir de todos modos el entorno de OpenSSL: sin esa corrección, otras operaciones de su proceso basadas en OpenSSL (en particular, TLS hacia el Babel Licensing Service) seguirán fallando.