Fips Compliance logo

Fips Compliance

Organization
RedHatProductSecurity
fips-compliance

Enforce FIPS 140-2/140-3 compliance for RHEL, OpenShift, and Go workloads. Use when building, configuring, reviewing, or auditing systems that require FIPS-validated cryptographic modules, RHEL crypto-policy enforcement, FIPS-ready Go binaries, or FIPS-mode kernel and cluster configuration.

Overview

PublisherRedHatProductSecurity
Repositoryprodsec-skills
Skill namefips-compliance
Stars
56
Forks
9
Bundled files
Instructions only
LicenseApache-2.0
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by RedHatProductSecurity on GitHub. Read the source before you install it.

Installation

Install the Fips Compliance AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/RedHatProductSecurity/prodsec-skills/tree/main/module/skills/fips-compliance
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/RedHatProductSecurity/prodsec-skills.git /tmp/prodsec-skills
mkdir -p .claude/skills
cp -r /tmp/prodsec-skills/module/skills/fips-compliance .claude/skills/fips-compliance
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Fips Compliance in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Fips Compliance on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Fips Compliance is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

FIPS Compliance

Guidance for enforcing Federal Information Processing Standards (FIPS) 140-2 and 140-3 across RHEL/RHCOS nodes, OpenShift clusters, Go applications, and container workloads. For general algorithm guidance and post-quantum readiness, see algorithm-selection. For TLS version and cipher suite enforcement on Kubernetes, see tls-compliance.

FIPS Mode Enforcement

LayerMechanismValidation Command
RHCOS/RHEL kernelfips=1 boot parametercat /proc/sys/crypto/fips_enabled returns 1
RHEL crypto policyupdate-crypto-policies --set FIPSupdate-crypto-policies --show returns FIPS
OpenShift clusterfips: true in install-config.yamloc get cm -n openshift-config -o jsonpath='{.items[*].data.install-config}'
etcd encryptionaescbc or aesgcm encryption typeSee etcd Encryption at Rest verification commands

Critical: OpenShift FIPS mode must be enabled at install time — it cannot be enabled post-deployment. The installer must run from a RHEL host already in FIPS mode, using the openshift-install-fips binary extracted from the release image.

SSH keys: Do not use ed25519 keys when installing a FIPS-enabled cluster. ed25519 is not FIPS-approved — use RSA instead.

FIPS-Approved and Prohibited Algorithms

CategoryApprovedProhibited in FIPS Mode
Symmetric encryptionAES-128, AES-192, AES-256 (GCM, CBC, CCM)ChaCha20-Poly1305, RC4, Blowfish, DES, 3DES
HashingSHA-256, SHA-384, SHA-512, SHA-3MD5, SHA-1 (for signatures/integrity)
AsymmetricRSA >= 2048, ECDSA (P-256, P-384, P-521)RSA < 2048, non-NIST curves
Key exchangeECDHE (P-256, P-384), DH >= 2048X25519 (not FIPS-validated), static RSA
MACHMAC-SHA-256, HMAC-SHA-384Poly1305
Post-quantumNone currently FIPS-validatedML-KEM, ML-DSA, X25519MLKEM768 (awaiting NIST validation)

FIPS and PQC are mutually exclusive today. Post-quantum algorithms like X25519MLKEM768 cannot be used on FIPS-enabled clusters because they have not been submitted to NIST for FIPS validation. Plan for this to change as NIST completes PQC module validation.

RHEL Crypto Policies

RHEL system-wide crypto policies enforce FIPS constraints across all crypto libraries (OpenSSL, GnuTLS, NSS, libgcrypt, Kernel Crypto API).

bash
# Set FIPS policy
update-crypto-policies --set FIPS

# Verify active policy
update-crypto-policies --show

Subpolicies

Apply subpolicies on top of FIPS for additional restrictions or compatibility workarounds:

SubpolicyCommandEffect
NO-SHA1--set FIPS:NO-SHA1Disables SHA-1 in all signatures and certificates
NO-ENFORCE-EMS--set FIPS:NO-ENFORCE-EMSRelaxes mandatory TLS Extended Master Secret (see TLS in FIPS Mode)
OSPP--set FIPS:OSPPCommon Criteria restrictions — RSA/DH >= 3072 bits
NO-CAMELLIA--set FIPS:NO-CAMELLIARemoves Camellia ciphers

Custom Subpolicies

Create .pmod files in /etc/crypto-policies/policies/modules/ for site-specific restrictions:

ini
# /etc/crypto-policies/policies/modules/SITE.pmod
cipher@SSH = -CHACHA20-POLY1305
ssh_etm = 0
bash
update-crypto-policies --set FIPS:SITE

Go FIPS Builds

Two distinct paths exist for building FIPS-compliant Go binaries. Choose based on your environment.

Red Hat Go Toolset (RHEL)

Red Hat's Go toolset routes crypto calls to the FIPS-validated OpenSSL module via CGO — it does not use Google's BoringCrypto.

ConstraintRequirement
CGO_ENABLEDMust be 1 (default) — setting to 0 disables OpenSSL linkage
Static linkingProhibited — -extldflags "-static" breaks dlopen for OpenSSL
-tags no_opensslProhibited — disables the OpenSSL integration
Base imageMust include OpenSSL (UBI images include it)
FIPS detectionAutomatic via /proc/sys/crypto/fips_enabled at runtime
go
import "github.com/golang-fips/openssl/v2"

func init() {
    openssl.Init("")
}

// Check FIPS status at runtime
if openssl.FIPS() {
    // Using FIPS-validated OpenSSL path
}
bash
# Verify binary links to OpenSSL
go tool nm ./myapp | grep -i dlopen_openssl

Upstream Go 1.24+ (Native FIPS 140-3)

Go 1.24 introduced native FIPS 140-3 support with CMVP Certificate #5247, independent of Red Hat's OpenSSL approach.

SettingOptions
GOFIPS140 (build-time)off (default), latest, v1.0.0, certified, inprocess
GODEBUG=fips140 (runtime)off (default), on, only (non-production — panics on non-FIPS calls)
APIcrypto/fips140.Enabled(), crypto/fips140.Version()

When FIPS mode is active, Go performs integrity self-checks at init, runs known-answer self-tests per FIPS 140-3 Implementation Guidance, and restricts crypto/tls to approved cipher suites and key exchange mechanisms.

Common Violations

ViolationWhy It Breaks FIPSFix
CGO_ENABLED=0No OpenSSL linkage (Red Hat path)Set CGO_ENABLED=1
-extldflags "-static"Prevents dlopen of OpenSSLUse dynamic linking
-tags no_opensslDisables OpenSSL integrationRemove the tag
Importing golang.org/x/cryptoNot FIPS-validated — may bypass validated modulesUse standard crypto/* packages
Using crypto/md5 for integrityMD5 is not FIPS-approved for security purposesUse crypto/sha256
ChaCha20-Poly1305 cipher suitesNot FIPS-approvedUse AES-GCM cipher suites

Historical: CVE-2023-3089

OpenShift 4.10–4.12 Go components were not configured to use FIPS-validated crypto modules, defaulting to Go's standard crypto library instead of OpenSSL. Approximately 50% of certificates on affected clusters were produced by non-compliant modules. Remediation required updating to patched releases and rotating certificates (or full reinstall for the most regulated environments). Red Hat has since added build-time enforcement policies that terminate builds using non-compliant crypto.

TLS in FIPS Mode

FIPS-Approved Cipher Suites

FIPS mode filters out non-approved ciphers. On OpenShift, the Ingress Operator automatically detects FIPS mode and removes non-compliant ciphers.

TLS 1.2 (FIPS-approved):

Cipher SuiteKey ExchangeEncryption
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256ECDHEAES-128-GCM
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256ECDHEAES-128-GCM
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384ECDHEAES-256-GCM
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384ECDHEAES-256-GCM

TLS 1.3 (FIPS-approved):

Cipher SuiteFIPS Status
TLS_AES_128_GCM_SHA256Approved
TLS_AES_256_GCM_SHA384Approved
TLS_CHACHA20_POLY1305_SHA256Filtered out on FIPS clusters

Extended Master Secret (EMS) Enforcement

Starting with RHEL 9.2, TLS Extended Master Secret (RFC 7627) is mandatory for all TLS 1.2 connections in FIPS mode. This is a FIPS 140-3 requirement.

Breaking change: Legacy clients that do not support EMS or TLS 1.3 (including RHEL 6/7 and Go <= 1.18) cannot connect to FIPS-enabled RHEL 9.2+ systems over TLS 1.2.

Workaround (non-compliant — use only during migration):

bash
update-crypto-policies --set FIPS:NO-ENFORCE-EMS

etcd Encryption at Rest

Encryption TypeAlgorithmStatus
aescbcAES-CBC with PKCS#7 padding, 32-byte keySupported
aesgcmAES-GCMSupported
identityNo encryptionNot compliant — secrets stored in plaintext

Verification

bash
# OpenShift API server
oc get openshiftapiserver -o=jsonpath='{range .items[0].status.conditions[?(@.type=="Encrypted")]}{.reason}{"\n"}{.message}{"\n"}'

# Kubernetes API server
oc get kubeapiserver -o=jsonpath='{range .items[0].status.conditions[?(@.type=="Encrypted")]}{.reason}{"\n"}{.message}{"\n"}'

# OAuth API server
oc get authentication.operator.openshift.io -o=jsonpath='{range .items[0].status.conditions[?(@.type=="Encrypted")]}{.reason}{"\n"}{.message}{"\n"}'

Expected output: EncryptionCompleted. Keys are rotated automatically on a weekly basis.

Limitation: Encryption keys are stored in plaintext on the nodes hosting the API server, co-located with etcd. This provides protection for etcd backups and offline disk access, but limited benefit against node-level compromise.

Operator and Workload Considerations

  • cert-manager: Certificate resources must specify FIPS-compliant key algorithms — RSA >= 2048 or ECDSA P-256/P-384 via spec.privateKey.algorithm and spec.privateKey.size. Do not use ed25519.
  • Service mesh: mTLS cipher suites must use FIPS-approved algorithms only. Post-quantum key exchange (X25519MLKEM768) is not available on FIPS-enabled clusters. Ambient mode (ztunnel) supports FIPS 140-2 with TLS 1.2.
  • Container images: Use FIPS-enabled UBI base images (registry.access.redhat.com/ubi9/ubi-minimal). The Red Hat Go toolchain must be used for the build stage. OpenSSL must be present in the runtime image.
  • Containers inherit host FIPS: Containers detect FIPS mode via /proc/sys/crypto/fips_enabled from the host kernel — no per-container FIPS configuration is needed.
  • FIPS validation terminology: Use "FIPS validated" (applies to cryptographic modules). "FIPS compliant" and "FIPS certified" are incorrect terms per NIST.

FIPS Validation Status

Red Hat submits five cryptographic modules per RHEL release for NIST CMVP validation:

ModulePurpose
OpenSSLPrimary crypto library (TLS, certificates, Go crypto)
Kernel Crypto APIKernel-level encryption (dm-crypt, IPsec)
GnuTLSAlternative TLS library
NSSNetwork Security Services (Firefox, certificate tools)
libgcryptGnuPG and other applications
RHEL VersionFIPS StandardValidation Deadline
RHEL 8.xFIPS 140-2Active through September 21, 2026
RHEL 9.0+FIPS 140-3Current standard
RHEL 10FIPS 140-3 onlyReuses RHEL 9 OpenSSL module

Auditing FIPS Compliance

bash
# Verify all nodes have FIPS kernel enabled
oc debug node/<node> -- chroot /host cat /proc/sys/crypto/fips_enabled

# Check crypto policy on nodes
oc debug node/<node> -- chroot /host update-crypto-policies --show

# Verify FIPS boot parameter
oc debug node/<node> -- chroot /host grep -o 'fips=[01]' /proc/cmdline

# Check IngressController TLS profile (should not include ChaCha20 on FIPS clusters)
oc get ingresscontroller default -n openshift-ingress-operator -o jsonpath='{.spec.tlsSecurityProfile}'

# Verify etcd encryption status
oc get kubeapiserver -o=jsonpath='{range .items[0].status.conditions[?(@.type=="Encrypted")]}{.reason}{"\n"}'

# Verify Go binary uses OpenSSL (Red Hat Go toolset)
go tool nm <binary> | grep -i dlopen_openssl

# Check kernel FIPS self-test results
oc debug node/<node> -- chroot /host journalctl -b | grep -i fips

Implementation Checklist

  • Cluster installed with fips: true in install-config from a FIPS-enabled RHEL host
  • All nodes report fips_enabled = 1 via /proc/sys/crypto/fips_enabled
  • Crypto policy set to FIPS (verify with update-crypto-policies --show)
  • Go binaries built with CGO_ENABLED=1 and dynamic linking (Red Hat path) or GOFIPS140=latest (upstream Go 1.24+)
  • No static linking, no_openssl tags, or golang.org/x/crypto usage in FIPS-critical paths
  • etcd encryption at rest enabled (aescbc or aesgcm) — not identity
  • TLS cipher suites restricted to FIPS-approved algorithms (no ChaCha20-Poly1305)
  • EMS enforcement verified for TLS 1.2 connections (RHEL 9.2+) or NO-ENFORCE-EMS applied with documented justification
  • cert-manager Certificates use RSA >= 2048 or ECDSA P-256/P-384 — no ed25519
  • Container base images are FIPS-enabled UBI with OpenSSL present
  • SSH keys use RSA — no ed25519
  • OCP 4.10–4.12 clusters have applied CVE-2023-3089 remediation and rotated certificates

References

Frequently asked questions

What does the Fips Compliance AI skill do?

Enforce FIPS 140-2/140-3 compliance for RHEL, OpenShift, and Go workloads. Use when building, configuring, reviewing, or auditing systems that require FIPS-validated cryptographic modules, RHEL crypto-policy enforcement, FIPS-ready Go binaries, or FIPS-mode kernel and cluster configuration.

Why use Fips Compliance on TypingMind?

Because you install it once and use it with any model. Fips Compliance is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Fips Compliance in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/RedHatProductSecurity/prodsec-skills/tree/main/module/skills/fips-compliance. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Fips Compliance?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Fips Compliance?

As many as you like. As long as a model supports skills, you can use Fips Compliance with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Fips Compliance AI skill free?

Yes. It is published on GitHub by RedHatProductSecurity under the Apache-2.0 license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇