Skip to Content
New release 11.7 available 🎉
LicensingFIPS Compliance

FIPS Compliance

Babel Licensing runs on FIPS-enabled Linux hosts, and its license validation does not rely on any algorithm that FIPS disallows. This page explains how the library behaves on such hosts, a startup issue you may encounter in containers, and how to resolve it.

Background

Many customers deploy on hosts where the operating system runs in FIPS mode — on Linux this is exposed as /proc/sys/crypto/fips_enabled = 1. In this mode the platform crypto provider (OpenSSL on Linux) is expected to service every cryptographic operation through a certified FIPS module.

A common problem arises when a container inherits the host’s FIPS flag but its base image does not ship a certified OpenSSL FIPS provider. OpenSSL 3 then tries to enter FIPS mode, fails to load the FIPS provider module, and ends up in a broken state where every digest and cipher operation fails — not only the ones FIPS would normally disallow. The typical error is:

Interop+Crypto+OpenSslCryptographicException: error:03000086:digital envelope routines::initialization error

This is an environment condition, not a defect in Babel Licensing. It is documented independently of Babel — see dotnet/dotnet-docker#5849  and dotnet/runtime#87884 . It affects any OpenSSL-backed .NET cryptography in the process, including TLS (HttpClient, gRPC), not just license validation.

How it can surface during license validation

Because the whole OpenSSL layer is unusable, the first cryptographic operation performed at startup is where the failure appears. When a license carries an expiration date, Babel Licensing opens a small local store used for expiry tracking and clock-rollback detection. On modern .NET the store initialization computes an identity hash through the platform provider, which throws on a broken-FIPS host. The failure is reported as:

Babel.Licensing.BabelLicenseException: Internal error ---> ...OpenSslCryptographicException: error:03000086:...

Hardening (Babel Licensing 11.7.x and later). The license store has been reworked so that a broken platform crypto stack no longer breaks license validation: the store transparently falls back to a fully managed implementation, and license validation degrades gracefully instead of failing. On healthy hosts behavior is unchanged. On earlier builds, apply the environment fix below.

Resolving it in containers

Make OpenSSL usable inside the container. Either option resolves the license-validation symptom and every other OpenSSL-backed operation in your process.

Option 1 — Do not auto-enter FIPS in the container

On Ubuntu-based .NET images, OpenSSL honors the OPENSSL_FORCE_FIPS_MODE environment variable. Set it to 0 so OpenSSL does not try to enter FIPS mode with a provider the image does not ship.

In docker-compose.yml, add it to the licensing service environment:

environment: # Do not auto-enter FIPS mode using a provider the image doesn't ship OPENSSL_FORCE_FIPS_MODE: 0

or in a Dockerfile:

ENV OPENSSL_FORCE_FIPS_MODE=0

Use this when the container itself does not need to be FIPS-validated: the host stays FIPS-enabled and only this container’s OpenSSL opts out of the broken auto-FIPS path.

Option 2 — Use a base image with a certified FIPS provider

If FIPS compliance is required inside the container, run on a base image that ships a validated FIPS provider so the crypto layer initializes correctly instead of failing:

  • Azure Linux 3.0 .NET images (mcr.microsoft.com/dotnet/aspnet:8.0-azurelinux3.0 and similar), which ship Microsoft’s FIPS-certified SymCrypt provider,
  • Red Hat UBI 9 based .NET images (registry.access.redhat.com/ubi9/dotnet-90 and similar), or
  • Ubuntu Pro with the FIPS-certified OpenSSL packages.

Babel Licensing Service on FIPS hosts

The Babel Licensing Service runs on FIPS-enabled hosts as long as the image actually ships a FIPS provider module. The full licensing workflow has been verified on Azure Linux 3.0, whose .NET images ship Microsoft’s FIPS-certified SymCrypt provider, with FIPS enforced:

  • the service starts and validates its own license,
  • license templates and RSA-signed licenses are created,
  • clients activate and validate licenses over gRPC,
  • node-locking, activation tokens, heartbeats and deactivation all work.

What happens when the FIPS module is missing

The distinction that matters is not “FIPS on or off”, but whether the provider module that FIPS mode requires is present.

OpenSSL 3 does not implement algorithms itself: it loads them from plug-in providers. In FIPS mode the configuration requires every algorithm to come from the certified FIPS provider (the fips.so module). If that module is not installed in the image — as is the case for the standard Debian/Ubuntu .NET images — OpenSSL cannot satisfy any request, so every algorithm fails, including the ones FIPS itself permits.

Since .NET on Linux delegates all cryptography to OpenSSL, this takes down more than hashing and ciphers:

.NET operationResult when fips.so is missing
SHA256 / SHA1error:03000086 ...initialization error
Aeserror:0308010C ...unsupported
RandomNumberGeneratorerror:12000090 ...unable to fetch drbg

Because even random-number generation fails, an ASP.NET Core application cannot start at all on such a host — it needs randomness during startup (data-protection keys, TLS). This affects every ASP.NET Core application, not just the Babel Licensing Service, and it is an environment misconfiguration: FIPS is being demanded from an image that cannot provide it. Resolve it with Option 1 or Option 2 above.

Verifying the environment

A quick check from inside the container tells you whether OpenSSL is healthy:

# Fails on a broken-FIPS host, succeeds once fixed echo test | openssl dgst -sha1
  • Failure with error:03000086 (or a message about fips.so not being loadable) — OpenSSL is in the broken state; apply Option 1 or 2.
  • A normal SHA1(stdin)= ... line — OpenSSL is healthy and Babel Licensing runs normally.

Even with the license-validation hardening, we recommend fixing the OpenSSL environment anyway: without it, other OpenSSL-backed operations in your process (notably TLS to the Babel Licensing Service) will still fail.

Last updated on