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 兼容凭证存储:
SunPKCSFeature 提供程序和网络安全服务(NSS)数据库。
如需更多信息,请参阅使用 SunPKCS Features 提供商和 NSS 数据库创建 FIPS 140-2 兼容凭证存储。
BouncyCastle 提供程序.
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 参考指南。
1.8.1.1. 在使用 SunPKCS Features 供应商和 NSS 数据库时支持 FIPS 的 JDK 复制链接链接已复制到粘贴板!
并非所有 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
# fips-mode-setup --check
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有关在 RHEL 中启用 FIPS 的详情,请查看以下资源:
- 在 Red Hat Enterprise Linux 文档中以 FIPS 模式 安装系统。
- 在 Red Hat Enterprise Linux 文档中 将系统切换到 FIPS 模式。
已安装 NSS 工具。
在 Red Hat Enterprise Linux 中,您可以使用 DNF 软件包管理器安装 NSS 工具,如下所示:
dnf install -y nss-tools
# dnf install -y nss-tools
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您的 Java 开发套件(JDK)支持使用 NSS 库配置 PKCS vary。
有关支持 FIPS 的 JDK 的详情,请参考 支持 FIPS 的 JDK。
- JBoss EAP 正在运行。
流程
将
$JAVA_HOME/conf/security/nss.fips.cfg
文件中的nssDbMode
值更新为readWrite
。nss.fips.cfg
内容示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 生成 AES secret 密钥以加密凭据存储。
注意您必须在命令中使用存储密码
NONE
。语法
keytool -genseckey -keystore NONE -storetype PKCS11 -storepass NONE -alias <key_alias> -keyalg <symmetric_key_algorithm> -keysize <key_size>
# keytool -genseckey -keystore NONE -storetype PKCS11 -storepass NONE -alias <key_alias> -keyalg <symmetric_key_algorithm> -keysize <key_size>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Example
keytool -genseckey -keystore NONE -storetype PKCS11 -storepass NONE -alias exampleKeyAlias -keyalg AES -keysize 256
# keytool -genseckey -keystore NONE -storetype PKCS11 -storepass NONE -alias exampleKeyAlias -keyalg AES -keysize 256
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 验证您可以读取 secret 密钥。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
$JAVA_HOME/conf/security/nss.fips.cfg
文件中的nssDbMode
值更新为readOnly
。nss.fips.cfg
内容示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在管理 CLI 中,将 SunJCE 提供程序添加到提供程序列表中。
为 SunJCE 添加供应商加载程序。
/subsystem=elytron/provider-loader=SunJCE:add(class-names=[com.sun.crypto.provider.SunJCE]) {"outcome" => "success"}
/subsystem=elytron/provider-loader=SunJCE:add(class-names=[com.sun.crypto.provider.SunJCE]) {"outcome" => "success"}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在聚合提供程序中配置 Elytron 和 SunJCE。
语法
/subsystem=elytron/aggregate-providers=<aggregate_provider_name>:add(providers=[elytron,SunJCE])
/subsystem=elytron/aggregate-providers=<aggregate_provider_name>:add(providers=[elytron,SunJCE])
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Example
/subsystem=elytron/aggregate-providers=exampleAggregateProvider:add(providers=[elytron,SunJCE]) {"outcome" => "success"}
/subsystem=elytron/aggregate-providers=exampleAggregateProvider:add(providers=[elytron,SunJCE]) {"outcome" => "success"}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意提供程序按照命令中定义的顺序调用。
使用 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>)
/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 Copied! Toggle word wrap Toggle overflow 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"}
/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 Copied! Toggle word wrap Toggle overflow
验证
为凭据存储添加一个别名。
语法
/subsystem=elytron/credential-store=<credential_store_name>:add-alias(alias=<alias>, secret-value=<secret_value>)
/subsystem=elytron/credential-store=<credential_store_name>:add-alias(alias=<alias>, secret-value=<secret_value>)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Example
/subsystem=elytron/credential-store=exampleFipsCredentialStore:add-alias(alias=exampleAlias, secret-value=secret) {"outcome" => "success"}
/subsystem=elytron/credential-store=exampleFipsCredentialStore:add-alias(alias=exampleAlias, secret-value=secret) {"outcome" => "success"}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 列出凭证存储中的别名。
语法
/subsystem=elytron/credential-store=<credential_store_name>:read-aliases()
/subsystem=elytron/credential-store=<credential_store_name>:read-aliases()
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Example
/subsystem=elytron/credential-store=exampleFipsCredentialStore:read-aliases() { "outcome" => "success", "result" => ["examplealias"] }
/subsystem=elytron/credential-store=exampleFipsCredentialStore:read-aliases() { "outcome" => "success", "result" => ["examplealias"] }
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
创建的凭证存储兼容 FIPS 140-2。
1.8.2. 使用 BouncyCastle 供应商创建 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。
1.8.2.1. 使用 BouncyCastle 供应商创建 FIPS 140-2 兼容凭证存储 复制链接链接已复制到粘贴板!
从 Red Hat Enterprise Linux 8.4 开始,如果您启用了联邦信息处理标准(FIPS)系统范围的加密策略,OpenJDK 会自动启用不同的安全供应商。其中一个安全供应商是在 FIPS 模式中配置的 SunPKCS11 供应商。您可以按照以下步骤使用 BouncyCastle 供应商创建联邦信息处理标准(FIPS) 140-2 兼容凭证存储。
先决条件
RHEL 中启用了 FIPS。
您可以使用以下命令检查是否启用了 FIPS:
fips-mode-setup --check
# fips-mode-setup --check
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有关在 RHEL 中启用 FIPS 的详情,请查看以下资源:
- 在 Red Hat Enterprise Linux 文档中以 FIPS 模式 安装系统。
- 在 Red Hat Enterprise Linux 文档中 将系统切换到 FIPS 模式。
您的 Java 开发套件(JDK)支持使用 BouncyCastle 供应商配置 FIPS。
如需更多信息,请参阅 Bouncy Castle - FIPS 资源页的 Java 相关问题。
流程
从以下链接下载 BouncyCastle jars:
- bc-fips-N jar: Bouncy Castle Provider (FIPS 分发) Maven.
bctls-fips-N jar: Bouncy Castle TLS/JSSE API (FIPS 分发)
其中 N 代表 BouncyCastle FIPS 供应商版本。
您可以在 Bouncy Castle 的 Legion 处找到有关符合您环境的 BouncyCastle FIPS 供应商的最新认证版本的信息。
创建名为
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
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 Copied! Toggle word wrap Toggle overflow 注意不要在默认的
java.security
文件中修改 FIPS 供应商。建议您使用您自己的java.security
属性文件,如此流程所述。生成 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>
$ 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 Copied! Toggle word wrap Toggle overflow 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
$ 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 Copied! Toggle word wrap Toggle overflow 验证您可以读取 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>
$ 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 Copied! Toggle word wrap Toggle overflow 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
$ 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 Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 启动服务器。
使用管理 CLI,将 JBoss EAP 配置为使用 BouncyCastle 提供程序。
将 SunJCE 提供程序添加到提供商列表中。
/subsystem=elytron/provider-loader=SunJCE:add(class-names=[com.sun.crypto.provider.SunJCE])
/subsystem=elytron/provider-loader=SunJCE:add(class-names=[com.sun.crypto.provider.SunJCE])
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 JBoss EAP 中将 BouncyCastle 提供程序 jar 作为模块添加。
语法
module add --name=org.bouncycastle.fips --resources=<path_to_bc-fips_jar>:<path_to_bctls-fips_jar>
module add --name=org.bouncycastle.fips --resources=<path_to_bc-fips_jar>:<path_to_bctls-fips_jar>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
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 Copied! Toggle word wrap Toggle overflow 为 BouncyCastle 提供程序添加供应商加载程序。
语法
/subsystem=elytron/provider-loader=<provider_loader_name>:add(module=org.bouncycastle.fips)
/subsystem=elytron/provider-loader=<provider_loader_name>:add(module=org.bouncycastle.fips)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Example
/subsystem=elytron/provider-loader=exampleProviderLoader:add(module=org.bouncycastle.fips)
/subsystem=elytron/provider-loader=exampleProviderLoader:add(module=org.bouncycastle.fips)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在聚合提供程序中配置 BouncyCastle、SunJCE 和 combined-providers。
语法
/subsystem=elytron/aggregate-providers=<aggregate_provider_name>:add(providers=[<provider_loader_name>,SunJCE,combined-providers])
/subsystem=elytron/aggregate-providers=<aggregate_provider_name>:add(providers=[<provider_loader_name>,SunJCE,combined-providers])
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Example
/subsystem=elytron/aggregate-providers=exampleAggregateProvider:add(providers=[exampleProviderLoader,SunJCE,combined-providers])
/subsystem=elytron/aggregate-providers=exampleAggregateProvider:add(providers=[exampleProviderLoader,SunJCE,combined-providers])
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意提供程序按照命令中定义的顺序调用。
重新加载服务器。
reload
reload
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
使用 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>)
/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 Copied! Toggle word wrap Toggle overflow 示例
/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)
/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 Copied! Toggle word wrap Toggle overflow
验证
为凭据存储添加一个别名。
语法
/subsystem=elytron/credential-store=<credential_store_name>:add-alias(alias=<alias>, secret-value=<secret_value>)
/subsystem=elytron/credential-store=<credential_store_name>:add-alias(alias=<alias>, secret-value=<secret_value>)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例
/subsystem=elytron/credential-store=exampleFipsCredentialStore:add-alias(alias=exampleAlias, secret-value=secret)
/subsystem=elytron/credential-store=exampleFipsCredentialStore:add-alias(alias=exampleAlias, secret-value=secret)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 列出凭证存储中的别名。
语法
/subsystem=elytron/credential-store=<credential_store_name>:read-aliases()
/subsystem=elytron/credential-store=<credential_store_name>:read-aliases()
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例
/subsystem=elytron/credential-store=exampleFipsCredentialStore:read-aliases() { "outcome" => "success", "result" => ["examplealias"] }
/subsystem=elytron/credential-store=exampleFipsCredentialStore:read-aliases() { "outcome" => "success", "result" => ["examplealias"] }
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
创建的凭证存储兼容 FIPS 140-2。