1.8. 创建 FIPS 140-2 兼容凭证存储


您可以在 Elytron 中配置联邦信息处理标准(FIPS) 140-2 兼容凭证存储。FIPS 140-2 是由美国开发的计算机安全标准。政府行业工作组以验证加密模块的质量。FIPS 发布(包括 140-2)可在 URL 中找到: http://csrc.nist.gov/publications/PubsFIPS.html

您可以使用两个不同的供应商在 Elytron 中配置 FIPS 140-2 兼容凭证存储:

重要

JBoss EAP 本身未经过 FIPS 认证。JBoss EAP 中的 FIPS 支持级别是 JBoss EAP 可用于 FIPS 认证的加密实现。经过测试的实施是 BouncyCastle 和 SunPKCS facilities。

NSS 是支持跨平台安全的客户端和服务器应用程序的一组库。您可以在 JBoss EAP 中使用 SunPKCS 提供者和 NSS 库来实现 FIPS 140-2 兼容加密。有关 NSS 的详情,请查看 Mozilla 文档 - 网络安全服务(NSS)。有关 SunPKCS powerful 供应商的详情,请参考 PKCS featured 参考指南

并非所有 Java 开发套件(JDK)供应商都支持使用网络安全服务(NSS)软件令牌(由 NSS 库实现),为联邦信息处理标准(FIPS) 140-2 合规性所需的网络安全服务(NSS)软件令牌进行配置。在 JBoss EAP 中使用 SunPKCS Features 供应商和 NSS 数据库配置 FIPS 之前,请确保您的 JDK 支持它。

以下是 JBoss EAP 支持的 JDK 列表,支持配置 SunPKCSCapabilities 安全性:

  • OpenJDK 11
  • OpenJDK 17

从 Red Hat Enterprise Linux 8.4 开始,如果您启用了联邦信息处理标准(FIPS)系统范围的加密策略,则还会自动启用 Java 的 FIPS。您可以使用默认网络安全服务(NSS)数据库来创建 FIPS 140-2 兼容凭证存储。

在此过程中,$JAVA_HOME 代表 JDK 安装路径。以 root 用户身份运行此流程中的命令。

先决条件

  • RHEL 中启用了 FIPS。

    您可以使用以下命令检查是否启用了 FIPS:

    # fips-mode-setup --check
    Copy to Clipboard Toggle word wrap

    有关在 RHEL 中启用 FIPS 的详情,请查看以下资源:

  • 已安装 NSS 工具。

    在 Red Hat Enterprise Linux 中,您可以使用 DNF 软件包管理器安装 NSS 工具,如下所示:

    # dnf install -y nss-tools
    Copy to Clipboard Toggle word wrap
  • 您的 Java 开发套件(JDK)支持使用 NSS 库配置 PKCS vary。

    有关支持 FIPS 的 JDK 的详情,请参考 支持 FIPS 的 JDK

  • JBoss EAP 正在运行。

流程

  1. $JAVA_HOME/conf/security/nss.fips.cfg 文件中的 nssDbMode 值更新为 readWrite

    nss.fips.cfg 内容示例

    name = NSS-FIPS
    nssLibraryDirectory = /usr/lib64
    nssSecmodDirectory = sql:/etc/pki/nssdb
    nssDbMode = readWrite
    nssModule = fips
    
    attributes(*,CKO_SECRET_KEY,CKK_GENERIC_SECRET)={ CKA_SIGN=true }
    Copy to Clipboard Toggle word wrap

  2. 生成 AES secret 密钥以加密凭据存储。

    注意

    您必须在命令中使用存储密码 NONE

    语法

    # keytool -genseckey -keystore NONE -storetype PKCS11 -storepass NONE -alias <key_alias> -keyalg <symmetric_key_algorithm> -keysize <key_size>
    Copy to Clipboard Toggle word wrap

    Example

    # keytool -genseckey -keystore NONE -storetype PKCS11 -storepass NONE -alias exampleKeyAlias -keyalg AES -keysize 256
    Copy to Clipboard Toggle word wrap

  3. 验证您可以读取 secret 密钥。

    # keytool -list -storetype pkcs11 -storepass NONE
    
    Keystore type: PKCS11
    Keystore provider: SunPKCS11-NSS-FIPS
    
    Your keystore contains 1 entry
    
    exampleKeyAlias, SecretKeyEntry,
    Copy to Clipboard Toggle word wrap
  4. $JAVA_HOME/conf/security/nss.fips.cfg 文件中的 nssDbMode 值更新为 readOnly

    nss.fips.cfg 内容示例

    name = NSS-FIPS
    nssLibraryDirectory = /usr/lib64
    nssSecmodDirectory = sql:/etc/pki/nssdb
    nssDbMode = readOnly
    nssModule = fips
    
    attributes(*,CKO_SECRET_KEY,CKK_GENERIC_SECRET)={ CKA_SIGN=true }
    Copy to Clipboard Toggle word wrap

  5. 在管理 CLI 中,将 SunJCE 提供程序添加到提供程序列表中。

    1. 为 SunJCE 添加供应商加载程序。

      /subsystem=elytron/provider-loader=SunJCE:add(class-names=[com.sun.crypto.provider.SunJCE])
      {"outcome" => "success"}
      Copy to Clipboard Toggle word wrap
    2. 在聚合提供程序中配置 Elytron 和 SunJCE。

      语法

      /subsystem=elytron/aggregate-providers=<aggregate_provider_name>:add(providers=[elytron,SunJCE])
      Copy to Clipboard Toggle word wrap

      Example

      /subsystem=elytron/aggregate-providers=exampleAggregateProvider:add(providers=[elytron,SunJCE])
      {"outcome" => "success"}
      Copy to Clipboard Toggle word wrap

      注意

      提供程序按照命令中定义的顺序调用。

  6. 使用 SunJCE 供应商在 Elytron 中创建凭证存储。

    语法

    /subsystem=elytron/credential-store=<credential_store_name>:add(implementation-properties={keyStoreType => PKCS11, external => true, keyAlias => <key_alias>, externalPath => <path_where_credential_store_is_to_be_saved>}, modifiable=true, credential-reference={clear-text=<password>}, create=true, other-providers=<aggregate_provider_name>)
    Copy to Clipboard Toggle word wrap

    Example

    /subsystem=elytron/credential-store=exampleFipsCredentialStore:add(implementation-properties={keyStoreType => PKCS11, external => true, keyAlias => exampleKeyAlias, externalPath => /home/ashwin/example.store}, modifiable=true, credential-reference={clear-text=secret}, create=true, other-providers=exampleAggregateProvider)
    {"outcome" => "success"}
    Copy to Clipboard Toggle word wrap

验证

  1. 为凭据存储添加一个别名。

    语法

    /subsystem=elytron/credential-store=<credential_store_name>:add-alias(alias=<alias>, secret-value=<secret_value>)
    Copy to Clipboard Toggle word wrap

    Example

    /subsystem=elytron/credential-store=exampleFipsCredentialStore:add-alias(alias=exampleAlias, secret-value=secret)
    {"outcome" => "success"}
    Copy to Clipboard Toggle word wrap

  2. 列出凭证存储中的别名。

    语法

    /subsystem=elytron/credential-store=<credential_store_name>:read-aliases()
    Copy to Clipboard Toggle word wrap

    Example

    /subsystem=elytron/credential-store=exampleFipsCredentialStore:read-aliases()
    {
        "outcome" => "success",
        "result" => ["examplealias"]
    }
    Copy to Clipboard Toggle word wrap

创建的凭证存储兼容 FIPS 140-2。

BouncyCastle 为 Java 和 C# 提供轻量级加密 API。您可以将以下 BouncyCastle 供应商与 JBoss EAP 搭配使用,以创建 FIPS 140-2 兼容凭证存储:

  • 用于 Java Cryptography 扩展(JCE)和 Java Cryptography 架构(JCA)的 BouncyCastle FIPS 供应商。
  • Java 安全套接字扩展(JSSE)的 BouncyCastle FIPS 供应商。

有关 BouncyCastle 的详情,请查看 Bouncy Castle 的 Legion

从 Red Hat Enterprise Linux 8.4 开始,如果您启用了联邦信息处理标准(FIPS)系统范围的加密策略,OpenJDK 会自动启用不同的安全供应商。其中一个安全供应商是在 FIPS 模式中配置的 SunPKCS11 供应商。您可以按照以下步骤使用 BouncyCastle 供应商创建联邦信息处理标准(FIPS) 140-2 兼容凭证存储。

先决条件

  • RHEL 中启用了 FIPS。

    您可以使用以下命令检查是否启用了 FIPS:

    # fips-mode-setup --check
    Copy to Clipboard Toggle word wrap

    有关在 RHEL 中启用 FIPS 的详情,请查看以下资源:

  • 您的 Java 开发套件(JDK)支持使用 BouncyCastle 供应商配置 FIPS。

    如需更多信息,请参阅 Bouncy Castle - FIPS 资源页的 Java 相关问题。

流程

  1. 从以下链接下载 BouncyCastle jars:

  2. 创建名为 java.security 的配置文件,其内容如下:

    fips.provider.1=org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider
    fips.provider.2=org.bouncycastle.jsse.provider.BouncyCastleJsseProvider fips:BCFIPS
    fips.provider.3=SUN
    fips.provider.4=SunEC
    fips.provider.5=com.sun.net.ssl.internal.ssl.Provider
    Copy to Clipboard Toggle word wrap
    注意

    不要在默认的 java.security 文件中修改 FIPS 供应商。建议您使用您自己的 java.security 属性文件,如此流程所述。

  3. 生成 AES secret 密钥以加密凭据存储。

    语法

    $ keytool -J-Djava.security.properties=<java_security_file> -genseckey -keystore "<keystore_name>" -storetype BCFKS -storepass <store_password> -alias <key_alias> -keyalg <symmetric_key_algorithm> -keysize <key_size> -keypass <key_password>  -provider org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider -providerpath <path_to_bc-fips_jar>  -dname "<certificate_contents>" -validity <validity_in_days>
    Copy to Clipboard Toggle word wrap

    Example

    $ keytool -J-Djava.security.properties=<path_to_java_security_file>/java.security -genseckey -keystore "examplekeystore.bcfks" -storetype BCFKS -storepass password -alias exampleKeyAlias -keyalg AES -keysize 256 -keypass password -provider org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider -providerpath <path_to_bc-fips_jar>/bc-fips-1.0.2.jar -dname "CN=localhost" -validity 365
    Copy to Clipboard Toggle word wrap

  4. 验证您可以读取 secret 密钥。

    语法

    $ keytool -J-Djava.security.properties=<java_security_file> -list -keystore <keystore_name> -storetype BCFKS -storepass <store_password> -provider org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider -providerpath <path_to_bc-fips_jar>
    Copy to Clipboard Toggle word wrap

    Example

    $ keytool -J-Djava.security.properties=<path_to_java_security_file>/java.security -list -keystore examplekeystore.bcfks -storetype BCFKS -storepass password -provider org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider -providerpath <path_to_bc-fips_jar>/bc-fips-1.0.2.jar
    Copy to Clipboard Toggle word wrap

    输出示例

    Keystore type: BCFKS
    Keystore provider: BCFIPS
    
    Your keystore contains 1 entry
    
    exampleKeyAlias, Mar 1, 2023, SecretKeyEntry,
    Copy to Clipboard Toggle word wrap

  5. 启动服务器。
  6. 使用管理 CLI,将 JBoss EAP 配置为使用 BouncyCastle 提供程序。

    1. 将 SunJCE 提供程序添加到提供商列表中。

      /subsystem=elytron/provider-loader=SunJCE:add(class-names=[com.sun.crypto.provider.SunJCE])
      Copy to Clipboard Toggle word wrap
    2. 在 JBoss EAP 中将 BouncyCastle 提供程序 jar 作为模块添加。

      语法

      module add --name=org.bouncycastle.fips --resources=<path_to_bc-fips_jar>:<path_to_bctls-fips_jar>
      Copy to Clipboard Toggle word wrap

      Example

      module add --name=org.bouncycastle.fips --resources=<path_to_bc-fips_jar>/bc-fips-1.0.2.jar:<path_to_bctls-fips_jar>/bctls-fips-1.0.2.jar
      Copy to Clipboard Toggle word wrap

    3. 为 BouncyCastle 提供程序添加供应商加载程序。

      语法

      /subsystem=elytron/provider-loader=<provider_loader_name>:add(module=org.bouncycastle.fips)
      Copy to Clipboard Toggle word wrap

      Example

      /subsystem=elytron/provider-loader=exampleProviderLoader:add(module=org.bouncycastle.fips)
      Copy to Clipboard Toggle word wrap

    4. 在聚合提供程序中配置 BouncyCastle、SunJCE 和 combined-providers。

      语法

      /subsystem=elytron/aggregate-providers=<aggregate_provider_name>:add(providers=[<provider_loader_name>,SunJCE,combined-providers])
      Copy to Clipboard Toggle word wrap

      Example

      /subsystem=elytron/aggregate-providers=exampleAggregateProvider:add(providers=[exampleProviderLoader,SunJCE,combined-providers])
      Copy to Clipboard Toggle word wrap

      注意

      提供程序按照命令中定义的顺序调用。

    5. 重新加载服务器。

      reload
      Copy to Clipboard Toggle word wrap
  7. 使用 BouncyCastle 供应商在 Elytron 中创建凭证存储。

    语法

    /subsystem=elytron/credential-store=<credential_store_name>:add(credential-reference={clear-text=<key_and_keystore_password>},implementation-properties={keyAlias=<key_alias>,external=true,externalPath=<path_to_BCFKS_credential_store>,keyStoreType=BCFKS},create=true,path=<path_to_keystore>,modifiable=true, other-providers=<aggregate_provider_name>)
    Copy to Clipboard Toggle word wrap

    示例

    /subsystem=elytron/credential-store=exampleFipsCredentialStore:add(credential-reference={clear-text=password},implementation-properties={keyAlias=exampleKeyAlias,external=true, externalPath=credentialStore.bcfks, keyStoreType=BCFKS}, create=true, path=__<path_to_keystore>__/examplekeystore.bcfks, modifiable=true, other-providers=exampleAggregateProvider)
    Copy to Clipboard Toggle word wrap

验证

  1. 为凭据存储添加一个别名。

    语法

    /subsystem=elytron/credential-store=<credential_store_name>:add-alias(alias=<alias>, secret-value=<secret_value>)
    Copy to Clipboard Toggle word wrap

    示例

    /subsystem=elytron/credential-store=exampleFipsCredentialStore:add-alias(alias=exampleAlias, secret-value=secret)
    Copy to Clipboard Toggle word wrap

  2. 列出凭证存储中的别名。

    语法

    /subsystem=elytron/credential-store=<credential_store_name>:read-aliases()
    Copy to Clipboard Toggle word wrap

    示例

    /subsystem=elytron/credential-store=exampleFipsCredentialStore:read-aliases()
    {
        "outcome" => "success",
        "result" => ["examplealias"]
    }
    Copy to Clipboard Toggle word wrap

创建的凭证存储兼容 FIPS 140-2。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat