Menu Close
Settings Close

Language and Page Formatting Options

第 4 章 凭证的安全存储

JBoss EAP 允许在配置文件外对敏感字符串进行加密。这些字符串可以存储在密钥存储中,然后用于应用和验证系统。敏感字符串可以存储在以下任一位置:

  • Credential Store - 在 JBoss EAP 7.1 中引入,通过加密存储到存储文件中,凭据存储可以安全地保护敏感和纯文本字符串。每个 JBoss EAP 服务器都可以包含多个凭据存储。
  • Password Vault - 通常在旧配置中使用,密码 vault 使用 Java 密钥存储来存储配置文件外的敏感字符串。每个 JBoss EAP 服务器都只能包含一个密码 vault。

EAP_HOME/standalone/configuration/EAP_HOME/domain/configuration/ 中的所有配置文件都可以默认读取。强烈建议您不要将明文密码存储在配置文件中,而将这些凭据放在 凭证存储 或者 密码 vault 中。

如果您决定将纯文本密码放在配置文件中,则仅限受限用户访问这些文件。至少,运行 JBoss EAP 7 的用户帐户需要读写访问。

4.1. 凭证存储在 Elytron 中

4.1.1. Elytron 提供的凭证存储

Elytron 提供两个默认凭证类型,您可以使用它来保存您的凭证:KeyStoreCredentialStore 和 PropertiesCredentialStore。您可以使用 JBoss EAP 管理 CLI 管理凭据存储,也可以使用 WildFly Elytron 工具管理它们脱机管理。除了两种默认存储类型外,您还可以创建、使用和管理您自己的自定义凭据存储。

4.1.1.1. KeyStoreCredentialStore/credential-store

您可以将所有 Elytron 凭证类型存储在 KeyStoreStore 中。elytron 子系统中的 KeyStore 的资源名称为 credentials-store。KeyStoreCredentialStore 使用 Java Development Kit(JDK)中的 KeyStore 实现提供的机制来保护您的凭证。

在管理 CLI 中访问 KeyStoreCredentialStore,如下所示:

/subsystem=elytron/credential-store

4.1.1.2. PropertiesCredentialStore/secret-key-credential-store

为了正确启动,JBoss EAP 需要初始密钥来解锁某些安全资源。使用 secret-key-credential-store 提供此主密钥来解锁这些必要的服务器资源。您还可以使用 PropertiesCredentialStore 存储 SecretKeyCredential,它支持存储高级加密标准(AES)secret 密钥。使用文件系统权限来限制对凭据存储的访问。理想情况下,您应该只向应用服务器授予访问权限,以限制访问此凭据存储。PropertiesCredentialStore 的 elytron 子系统中的资源名称是 secret-key-credential-store,您可以按照如下所示在管理 CLI 中访问它:

/subsystem=elytron/secret-key-credential-store

有关创建和提供初始密钥的信息,请参阅 向 JBoss EAP 提供初始密钥来解锁安全资源。另外,您还可以从外部来源获取 master 密钥或密码。有关从外部源获取密码的信息,请参阅 获取来自外部来源的凭据存储的密码

4.1.2. Elytron 中的凭证类型

Elytron 提供了以下三种凭证类型来满足您的各种安全需求,您可将这些凭据存储在 Elytron 的凭据存储中。

PasswordCredential

使用这个凭证类型,您可以安全地存储纯文本或未加密的密码。对于需要密码的 JBoss EAP 资源,请使用指向 PasswordCredential 而不是纯文本密码的引用来维护密码的保密。

连接到数据库的示例

data-source add ... --user-name=db_user --password=StrongPassword

在这个示例数据库连接命令中,您可以看到密码: StrongPassword。这意味着其他人也可以在服务器配置文件中看到。

使用密码凭证连接到数据库的示例

data-source add ... --user-name=db_user --credential-reference={store=exampleKeyStoreCredentialStore, alias=passwordCredentialAlias}

当使用凭证引用而不是密码连接到数据库时,其它只能看到配置文件中的凭证引用,而不是您的密码

KeyPairCredential

您可以将 Secure Shell(SSH)和公钥 Cryptography Standards(PKCS)密钥对用作 KeyPairCredential。密钥对包括共享公钥和只有给定用户所知的私钥。

您只能使用 WildFly Elytron 工具管理 KeyPairCredential。

SecretKeyCredential
SecretKeyCredential 是高级加密标准(AES)密钥,可用于在 Elytron 中创建加密的表达式。有关加密表达式的详情,请参考 Elytron 中的加密表达式

4.1.3. Elytron 凭证存储支持的凭证类型

下表描述了哪个凭证存储支持哪些凭证类型:

凭证类型KeyStoreCredentialStore/credential-storePropertiesCredentialStore/secret-key-credential-store

PasswordCredential

KeyPairCredential

SecretKeyCredential

4.1.4. 使用 JBoss EAP 管理 CLI 的凭据存储操作

要在运行的 JBoss EAP 服务器中管理 JBoss EAP 凭据,请使用提供的管理 CLI 操作。您可以使用 JBoss EAP 管理 CLI 管理 PasswordCredentialSecretKeyCredential

注意

您只能对可修改的凭证存储进行这些操作。所有凭据存储类型默认为可修改。

4.1.4.1. 为独立服务器创建 KeyStore/credential-store

为在文件系统的任意目录中作为单机服务器运行的 JBoss EAP 创建一个 KeyStoreStore。为安全起见,只有有限用户才可以访问包含存储的目录。

先决条件

  • 您至少提供对运行 JBoss EAP 的用户帐户的 KeyStoreCredentialStore 的目录的读/写权限。
注意

您不能与凭证存储和 secret-key- credential- store 的名称相同,因为它们实施相同的 Elytron 功能: org.wildfly.security.credential-store

流程

  • 使用以下管理 CLI 命令,创建一个 KeyStoreCredentialStore:

    语法

    /subsystem=elytron/credential-store=<name_of_credential_store>:add(path="<path_to_store_file>", relative-to=<base_path_to_store_file>, credential-reference={clear-text=<store_password>}, create=true)

    示例

    /subsystem=elytron/credential-store=exampleKeyStoreCredentialStore:add(path="exampleKeyStoreCredentialStore.jceks", relative-to=jboss.server.data.dir, credential-reference={clear-text=password}, create=true)
    {"outcome" => "success"}

4.1.4.2. 为受管域创建 KeyStore/credential-store

您可以在受管集群中创建 KeyStoreCredentialStore,但必须首先使用 WildFly Elytron 工具准备您的 KeyStoreCredentialStore。如果一个受管域中有多个主机控制器,请选择以下选项之一:

  • 在每个主机控制器中创建 KeyStoreCredentialStore,并为每个 KeyStoreStore 添加凭证。
  • 将填充的 KeyStoreStore 从一个主机操作系统复制到所有其他主机控制器。
  • 将 KeyStoreCredentialStore 文件保存到网络文件系统(NFS)中,然后将该文件用于您创建的所有 KeyStoreCredentialStore 资源。

或者,您可以使用主机控制器上的凭证创建 KeyStoreCredentialStore 文件,而无需使用 WildFly Elytron 工具。

注意

您不必在每台服务器上定义一个 KeyStore 资源,因为同一配置集中的每台服务器都包含您的 KeyStoreCredentialStore 文件。您可以在服务器 数据 目录中找到 KeyStoreCredentialStore 文件,相对-to=jboss.server.data.dir

重要

您不能与凭证存储和 secret-key- credential- store 的名称相同,因为它们实施相同的 Elytron 功能: org.wildfly.security.credential-store

以下流程描述了如何使用 NFS 向所有主机控制器提供 KeyStoreCredentialStore 文件。

流程

  1. 使用 WildFly Elytron 工具创建 KeyStoreCredentialStore 存储文件。有关此问题的更多信息,请参阅使用 WildFly Elytron 工具 存储操作
  2. 分发存储文件。例如,使用 scp 命令将它分配给每个主机控制器,或者将其存储在 NFS 中,并将其用于所有 KeyStoreCredentialStore 资源。

    注意

    为了保持一致性,对于多个资源和主机操作系统使用的 KeyStoreStore 文件,您必须以只读模式使用 KeyStoreStore。另外,请确保为您的 KeyStoreStore 文件提供绝对路径。

    语法

    /profile=<profile_name>/subsystem=elytron/credential-store=<name_of_credential_store>:add(path=<absolute_path_to_store_keystore>,credential-reference={clear-text="<store_password>"},create=false,modifiable=false)

    示例

    /profile=full-ha/subsystem=elytron/credential-store=exampleCredentialStoreDomain:add(path=/usr/local/etc/example-cred-store.cs,credential-reference={clear-text="password"},create=false,modifiable=false)

  3. 可选: 如果您需要在配置集中定义 credential-store 资源,请使用存储文件来创建资源。

    语法

    /profile=<profile_name>/subsystem=elytron/credential-store=<name_of_credential_store>:add(path=<path_to_store_file>,credential-reference={clear-text="<store_password>"})

    示例

    /profile=full-ha/subsystem=elytron/credential-store=exampleCredentialStoreHA:add(path=/usr/local/etc/example-cred-store-ha.cs, credential-reference={clear-text="password"})

  4. 可选: 为主机控制器创建 KeyStoreStore 资源。

    语法

    /host=<host_controller_name>/subsystem=elytron/credential-store=<name_of_credential_store>:add(path=<path_to_store_file>,credential-reference={clear-text="<store_password>"})

    示例

    /host=master/subsystem=elytron/credential-store=exampleCredentialStoreHost:add(path=/usr/local/etc/example-cred-store-host.cs, credential-reference={clear-text="password"})

4.1.4.3. 为独立服务器创建 PropertiesCredentialStore/secret-key-credential-store

使用管理 CLI 创建 PropertiesCredentialStore。在创建 PropertiesCredentialStore 时,JBoss EAP 默认生成 secret key。生成的密钥的名称是 key,其大小为 256 位。

先决条件

  • 您至少提供对运行 JBoss EAP 的用户帐户的 PropertiesCredentialStore 的目录的读/写权限。

流程

  • 使用以下命令,使用管理 CLI 创建 PropertiesCredentialStore:

    语法

    /subsystem=elytron/secret-key-credential-store=<name_of_credential_store>:add(path="<path_to_the_credential_store>", relative-to=<path_to_store_file>)

    示例

    /subsystem=elytron/secret-key-credential-store=examplePropertiesCredentialStore:add(path=examplePropertiesCredentialStore.cs, relative-to=jboss.server.config.dir)
    {"outcome" => "success"}

4.1.4.4. 将密码凭证添加到 KeyStoreStore/credential-store

为那些需要一个 PasswordCredential 到 KeyStore 的资源添加纯文本密码,以便在配置文件中隐藏该密码。然后,您可以引用该存储的凭证来访问这些资源,而无需公开您的密码。

先决条件

流程

  • 将新的 PasswordCredential 添加到 KeyStoreCredentialStore:

    语法

    /subsystem=elytron/credential-store=<name_of_credential_store>:add-alias(alias=<alias>, secret-value=<secret-value>)

    示例

    /subsystem=elytron/credential-store=exampleKeyStoreCredentialStore:add-alias(alias=passwordCredentialAlias, secret-value=StrongPassword)
    {"outcome" => "success"}

验证

  • 发出以下命令以验证 PasswordCredential 是否已添加到 KeyStoreCredentialStore 中:

    语法

    /subsystem=elytron/credential-store=<name_of_credential_store>:read-aliases()

    示例

    /subsystem=elytron/credential-store=exampleKeyStoreCredentialStore:read-aliases()
    {
        "outcome" => "success",
        "result" => ["passwordcredentialalias"]
    }

4.1.4.5. 在 KeyStoreStore/credential-store 中生成 SecretKeyCredential

在 KeyStoreCredentialStore 中生成 SecretKeyCredential。默认情况下,Elytron 创建 256 位密钥。如果需要不同的大小,您可以在 key-size 属性中指定 128 位或 192 位键。

先决条件

流程

  1. 使用以下管理 CLI 命令,在 KeyStoreCredential 中生成 SecretKeyCredential:

    语法

    /subsystem=elytron/credential-store=<name_of_credential_store>:generate-secret-key(alias=<alias>, key-size=<128_or_192>)

    示例

    /subsystem=elytron/credential-store=exampleKeyStoreCredentialStore:generate-secret-key(alias=secretKeyCredentialAlias)

验证

  • 发出以下命令,以验证 Elytron 将您的 SecretKeyCredential 存储在 KeyStoreCredentialStore 中:

    语法

    /subsystem=elytron/credential-store=<credential_store>:read-aliases()

    示例

    /subsystem=elytron/credential-store=exampleKeyStoreCredentialStore:read-aliases()
    {
        "outcome" => "success",
        "result" => [
            "secretkeycredentialalias"
        ]
    }

4.1.4.6. 在 PropertiesCredentialStore/secret-key-credential-store 中生成 SecretKeyCredential

在 PropertiesCredentialStore 中生成 SecretKeyCredential。默认情况下,Elytron 创建 256 位密钥。如果需要不同的大小,您可以在 key-size 属性中指定 128 位或 192 位键。

当您生成 SecretKeyCredential 时,Elytron 生成一个新的随机 secret 密钥,并将其保存为 SecretKeyCredential。您可以使用 PropertiesCredentialStore 上的 export 操作来查看凭证的内容。

重要

确保您创建 PropertiesCredentialStore、SecretKeyCredential 或两者的备份,因为 JBoss EAP 无法解密或检索丢失的 Elytron 凭据。

您可以使用 PropertiesCredentialStore 上的 export 操作来获取 SecretKeyCredential 的值。然后您可以将这个值保存为备份。如需更多信息,请参阅从 PropertiesCredentialStore/secret-key-credential-store 导出 SecretKey Credential

先决条件

流程

  • 使用以下管理 CLI 命令,在 PropertiesCredentialStore 中生成 SecretKeyCredential:

    语法

    /subsystem=elytron/secret-key-credential-store=<name_of_the_properties_credential_store>:generate-secret-key(alias=<alias>, key-size=<128_or_192>)

    示例

    /subsystem=elytron/secret-key-credential-store=examplePropertiesCredentialStore:generate-secret-key(alias=secretKeyCredentialAlias)
    {"outcome" => "success"}

验证

  • 发出以下命令以验证 Elytron 创建了 SecretKeyCredential:

    语法

    /subsystem=elytron/secret-key-credential-store=<name_of_the_properties_credential_store>:read-aliases()

    示例

    /subsystem=elytron/secret-key-credential-store=examplePropertiesCredentialStore:read-aliases()
    {
        "outcome" => "success",
        "result" => [
            "secretkeycredentialalias",
            "key"
        ]
    }

4.1.4.7. 将 SecretKeyCredential 导入到 PropertiesCredentialStore/secret-key-credential-store

您可以将在 PropertiesCredentialStore 之外创建的 SecretKeyCredential 导入到 Elytron PropertiesCredentialStore 中。假设您从另一个凭证存储中导出了一个 SecretKeyCredential,例如,De-jaxba KeyStoreStore,您可以将其导入到 PropertiesCredentialStore。

先决条件

流程

  1. 使用以下命令在管理 CLI 中禁用命令缓存:

    重要

    如果不禁用缓存,则可以访问管理 CLI 历史记录文件的任何人都可以看到 secret 密钥。

    history --disable
  2. 使用以下管理 CLI 命令导入 secret 密钥:

    语法

    /subsystem=elytron/secret-key-credential-store=<name_of_credential_store>:import-secret-key(alias=<alias>, key="<secret_key>")

    示例

    /subsystem=elytron/secret-key-credential-store=examplePropertiesCredentialStore:import-secret-key(alias=imported, key="RUxZAUs+Y1CzEPw0g2AHHOZ+oTKhT9osSabWQtoxR+O+42o11g==")

  3. 使用以下管理 CLI 命令重新启用命令缓存:

    history --enable

4.1.4.8. 列出 KeyStoreStore/credential-store 中的凭证

要查看 KeyStoreCredentialStore 中存储的所有凭据,您可以使用管理 CLI 列出它们。

流程

  • 使用以下管理 CLI 命令,列出存储在 KeyStoreStore 中的凭证:

    语法

    /subsystem=elytron/credential-store=<name_of_credential_store>:read-aliases()

    示例

    /subsystem=elytron/credential-store=exampleKeyStoreCredentialStore:read-aliases()
    {
        "outcome" => "success",
        "result" => [
            "passwordcredentialalias",
            "secretkeycredentialalias"
        ]
    }

4.1.4.9. 列出 PropertiesCredentialStore/secret-key-credential-store 中的凭证

要查看 PropertiesCredentialStore 中存储的所有凭据,您可以使用管理 CLI 列出这些凭证。

流程

  • 使用以下管理 CLI 命令,列出存储在 PropertiesCredentialStore 中的凭证:

    语法

    /subsystem=elytron/secret-key-credential-store=<name_of_credential_store>:read-aliases()

    示例

    /subsystem=elytron/secret-key-credential-store=examplePropertiesCredentialStore:read-aliases()
    {
        "outcome" => "success",
        "result" => [
            "secretkeycredentialalias",
            "key"
        ]
    }

4.1.4.10. 从 KeyStoreCredential/credential-store 导出 SecretKeyCredential

您可以从 KeyStoreCredential 导出现有的 SecretKeyCredential,以使用 SecretKeyCredential 或 创建 SecretKeyCredential 的备份。

先决条件

流程

  • 使用以下管理 CLI 命令,从 KeyStoreCredential 导出 SecretKeyCredential:

    语法

    /subsystem=elytron/credential-store=<name_of_credential_store>:export-secret-key(alias=<alias>)

    示例

    /subsystem=elytron/credential-store=exampleKeyStoreCredentialStore:export-secret-key(alias=secretKeyCredentialAlias)
    {
        "outcome" => "success",
        "result" => {"key" => "RUxZAUui+8JkoDCE6mFyA3cCIbSAZaXq5wgYejj1scYgdDqWiw=="}
    }

4.1.4.11. 从 PropertiesCredentialStore/secret-key-credential-store 导出 SecretKeyCredential

您可以从 PropertiesCredentialStore 导出现有的 SecretKeyCredential,以使用 SecretKeyCredential 或创建 SecretKeyCredential 的备份。

先决条件

流程

  • 使用以下管理 CLI 命令,从 PropertiesCredentialStore 导出 SecretKeyCredential:

    语法

    /subsystem=elytron/secret-key-credential-store=<name_of_credential_store>:export-secret-key(alias=<alias>)

    示例

    /subsystem=elytron/secret-key-credential-store=examplePropertiesCredentialStore:export-secret-key(alias=secretkeycredentialalias)
    {
        "outcome" => "success",
        "result" => {"key" => "RUxZAUtxXcYvz0aukZu+odOynIr0ByLhC72iwzlJsi+ZPmONgA=="}
    }

4.1.4.12. 从 KeyStoreCredentialStore/credential-store 中删除凭证

您可以将每个凭证类型存储在 KeyStoreStore 中,但默认情况下,当您删除凭证时,Elytron 会假定它是 PasswordCredential。如果要删除其他凭证类型,请在 entry-type 属性中指定它。

流程

  • 使用以下管理 CLI 命令,从 KeyStoreStore 中删除凭证:

    语法

    /subsystem=elytron/credential-store=<name_of_credential_store>:remove-alias(alias=<alias>, entry-type=<credential_type>)

    删除密码凭证示例

    /subsystem=elytron/credential-store=exampleKeyStoreCredentialStore:remove-alias(alias=passwordCredentialAlias)
    {
        "outcome" => "success",
        "response-headers" => {"warnings" => [{
            "warning" => "Update dependent resources as alias 'passwordCredentialAlias' does not exist anymore",
            "level" => "WARNING",
            "operation" => {
                "address" => [
                    ("subsystem" => "elytron"),
                    ("credential-store" => "exampleKeyStoreCredentialStore")
                ],
                "operation" => "remove-alias"
            }
        }]}
    }

    删除 SecretKeyCredential 示例

    /subsystem=elytron/credential-store=exampleKeyStoreCredentialStore:remove-alias(alias=secretKeyCredentialAlias, entry-type=SecretKeyCredential)
    {
        "outcome" => "success",
        "response-headers" => {"warnings" => [{
            "warning" => "Update dependent resources as alias 'secretKeyCredentialAl
    ias' does not exist anymore",
            "level" => "WARNING",
            "operation" => {
                "address" => [
                    ("subsystem" => "elytron"),
                    ("credential-store" => "exampleKeyStoreCredentialStore")
                ],
                "operation" => "remove-alias"
            }
        }]}
    }

验证

  • 发出以下命令以验证 Elytron 删除了凭证:

    语法

    /subsystem=elytron/credential-store=<name_of_credential_store>:read-aliases()

    示例

    /subsystem=elytron/credential-store=exampleKeyStoreCredentialStore:read-aliases()
    {
        "outcome" => "success",
        "result" => []
    }

    您删除的凭证不会被列出。

4.1.4.13. 从 PropertiesCredentialStore/secret-key-credential-store 中删除凭证

您只能将 SecretKeyCredential 类型存储在 PropertiesCredentialStore 中。这意味着,当您从 PropertiesCredentialStore 中删除凭证时,您不必指定 entry-type

流程

  • 使用以下命令,从 PropertiesCredentialStore 中删除 SecretKeyCredential:

    语法

    /subsystem=elytron/secret-key-credential-store=<name_of_credential_store>:remove-alias(alias=<alias>)

    示例

    /subsystem=elytron/secret-key-credential-store=examplePropertiesCredentialStore:remove-alias(alias=secretKeyCredentialAlias)
    {
        "outcome" => "success",
        "response-headers" => {"warnings" => [{
            "warning" => "Update dependent resources as alias 'secretKeyCredentialAlias' does not exist anymore",
            "level" => "WARNING",
            "operation" => {
                "address" => [
                    ("subsystem" => "elytron"),
                    ("secret-key-credential-store" => "examplePropertiesCredentialSt
    ore")
                ],
                "operation" => "remove-alias"
            }
        }]}
    }

验证

  • 发出以下命令以验证 Elytron 删除了凭证:

    语法

    /subsystem=elytron/secret-key-credential-store=<name_of_credential_store>:read-aliases()

    示例

    /subsystem=elytron/secret-key-credential-store=examplePropertiesCredentialStore:read-aliases()
    {
        "outcome" => "success",
        "result" => []
    }

    您删除的凭证不会被列出。

4.1.5. 使用 WildFly Elytron 工具进行凭证存储操作

4.1.5.1. 使用 WildFly Elytron 工具创建 KeyStore/credential-store

在 Elytron 中,您可以创建一个 KeyStoreCredentialStore,您可以在其中保存所有凭证类型。

流程

  • 使用以下命令,使用 WildFly Elytron 工具创建一个 KeyStoreStore:

    语法

    $ EAP_HOME/bin/elytron-tool.sh credential-store --create --location "<path_to_store_file>" --password <store_password>

    示例

    $ EAP_HOME/bin/elytron-tool.sh credential-store --create --location "../cred_stores/example-credential-store.jceks" --password storePassword
    Credential Store has been successfully created

    如果您不想将存储密码包含在命令中,请省略该参数,然后在提示符下手动输入密码。您还可以使用由 WildFly Elytron 工具生成的已屏蔽密码。有关生成屏蔽密码的详情,请参考使用 WildFly Elytron 工具生成屏蔽的加密字符串

4.1.5.2. 使用 Bouncy Castle 供应商创建 KeyStoreStore/credential-store

使用 Bouncy Castle 供应商创建一个 KeyStoreCredentialStore。

先决条件

注意

您不能与凭证存储和 secret-key- credential- store 的名称相同,因为它们实施相同的 Elytron 功能: org.wildfly.security.credential-store

流程

  1. 定义 Bouncy Castle FIPS 密钥存储(BCFKS)密钥存储。FIPS 代表联邦信息处理标准。如果您已有,请转到下一步。

    $ keytool -genkeypair -alias <key_pair_alias> -keyalg <key_algorithm> -keysize <key_size> -storepass <key_pair_and_keystore_password> -keystore <path_to_keystore> -storetype BCFKS -keypass <key_pair_and_keystore_password>
    重要

    确保密钥存储 keypassstorepass 属性相同。如果没有,elytron 子系统中的 BCFKS 密钥存储将无法定义它们。

  2. 为 KeyStoreCredentialStore 生成 secret 密钥。

    $ keytool -genseckey -alias <key_alias> -keyalg <key_algorithm> -keysize <key_size> -keystore <path_to_keystore> -storetype BCFKS -storepass <key_and_keystore_password> -keypass <key_and_keystore_password>
  3. 使用以下命令,使用 WildFly Elytron 工具定义 KeyStoreCredentialStore:

    $ EAP_HOME/bin/elytron-tool.sh credential-store -c -a <alias> -x <alias_password> -p <key_and_keystore_password> -l <path_to_keystore> -u "keyStoreType=BCFKS;external=true;keyAlias=<key_alias>;externalPath=<path_to_credential_store>"

4.1.5.3. 使用 WildFly Elytron 工具创建 PropertiesCredentialStore/secret-key-credential-store

在 Elytron 中,您可以创建一个 PropertiesCredentialStore 离线,您可以在其中保存 SecretKeyCredential 实例。

流程

  • 使用以下命令,使用 WildFly Elytron 工具创建 PropertiesCredentialStore:

    语法

    $ EAP_HOME/bin/elytron-tool.sh credential-store --create --location "<path_to_store_file>" --type PropertiesCredentialStore

    示例

    $ bin/elytron-tool.sh credential-store --create --location=standalone/configuration/properties-credential-store.cs --type PropertiesCredentialStore
    Credential Store has been successfully created

4.1.5.4. WildFly Elytron 工具 KeyStoreCredentialStore/credential-store 操作

您可以使用 WildFly Elytron 工具执行各种 KeyStore 的任务,其中包括:

添加密码凭证

您可以使用以下 WildFly Elytron 工具命令将密码Credential 添加到 KeyStoreStore 中:

语法

$ EAP_HOME/bin/elytron-tool.sh credential-store --location "<path_to_store_file>" --password <store_password> --add <alias> --secret <sensitive_string>

示例

$ EAP_HOME/bin/elytron-tool.sh credential-store --location "../cred_stores/example-credential-store.jceks" --password storePassword --add examplePasswordCredential --secret speci@l_db_pa$$_01
Alias "examplePasswordCredential" has been successfully stored

如果您不想将 secret 放在命令中,请省略该参数,然后在提示时手动输入 secret。

生成 SecretKeyCredential

您可以使用以下 WildFly Elytron 工具命令将 SecretKeyCredential 添加到 KeyStoreCredentialStore 中:

语法

$ EAP_HOME/bin/elytron-tool.sh credential-store --generate-secret-key=example --location=<path_to_the_credential_store> --password <store_password>

示例

$ EAP_HOME/bin/elytron-tool.sh credential-store --generate-secret-key=example --location "../cred_stores/example-credential-store.jceks" --password storePassword
Alias "example" has been successfully stored

如果您不想将 secret 放在命令中,请省略该参数,然后在提示时手动输入 secret。

默认情况下,当您在 JBoss EAP 中创建 SecretKeyCredential 时,您可以创建一个 256 位 secret 密钥。如果要更改大小,您可以指定 --size=128--size=192 分别创建 128 位或 192 位键。

导入 SecretKeyCredential

您可以使用以下 WildFLy Elytron 工具命令导入 SecretKeyCredential:

语法

$ EAP_HOME/bin/elytron-tool.sh credential-store --import-secret-key=imported --location=<path_to_credential_store> --password=<store_password>

示例

$ EAP_HOME/bin/elytron-tool.sh credential-store --import-secret-key=imported --location=../cred_stores/example-credential-store.jceks --password=storePassword

输入您要导入的 secret 密钥。

列出所有凭证

您可以使用以下 WildFly Elytron 工具命令列出 KeyStore 中的凭证:

语法

$ EAP_HOME/bin/elytron-tool.sh credential-store --location "<path_to_store_file>" --password <store_password> --aliases

例如:

$ EAP_HOME/bin/elytron-tool.sh credential-store --location "../cred_stores/example-credential-store.jceks" --password storePassword --aliases
Credential store contains following aliases: examplepasswordcredential example

检查是否存在别名

使用以下命令检查凭证存储中是否存在别名:

语法

$ EAP_HOME/bin/elytron-tool.sh credential-store --location "<path_to_store_file>" --password <store_password> --exists <alias>

示例

$ EAP_HOME/bin/elytron-tool.sh credential-store --location "../cred_stores/example-credential-store.jceks" --password storePassword --exists examplepasswordcredential
Alias "examplepasswordcredential" exists

导出 SecretKeyCredential

您可以使用以下命令从 KeyStoreCredential 导出 SecretKeyCredential:

语法

$ EAP_HOME/bin/elytron-tool.sh credential-store --export-secret-key=<alias> --location=<path_to_credential_store> --password=storePassword

示例

$ EAP_HOME/bin/elytron-tool.sh credential-store --export-secret-key=example --location=../cred_stores/example-credential-store.jceks --password=storePassword
Exported SecretKey for alias example=RUxZAUtBiAnoLP1CA+i6DtcbkZHfybBJxPeS9mlVOmEYwjjmEA==

删除凭证

您可以使用以下命令从凭证存储中删除凭证:

语法

$ EAP_HOME/bin/elytron-tool.sh credential-store --location "<path_to_store_file>" --password <store_password> --remove <alias>

示例

$ EAP_HOME/bin/elytron-tool.sh credential-store --location "../cred_stores/example-credential-store.jceks" --password storePassword --remove examplepasswordcredential
Alias "examplepasswordcredential" has been successfully removed

4.1.5.5. WildFly Elytron 工具 PropertiesCredentialStore/secret-key-credential-store 操作

您可以使用 WildFly Elytron 工具为 SecretKeyCredential 执行以下 PropertiesCredentialStore 操作:

生成 SecretKeyCredential

您可以使用以下 WildFly Elytron 工具在 PropertiesCredentialStore 中生成 SecteKeyCredential

语法

$ EAP_HOME/bin/elytron-tool.sh credential-store --generate-secret-key=example --location "<path_to_the_credential_store>" --type PropertiesCredentialStore

示例

$ EAP_HOME/bin/elytron-tool.sh credential-store --generate-secret-key=example --location "standalone/configuration/properties-credential-store.cs" --type PropertiesCredentialStore
Alias "example" has been successfully stored

导入 SecretKeyCredential

您可以使用以下 WildFLy Elytron 工具命令导入 SecretKeyCredential:

语法

$ EAP_HOME/bin/elytron-tool.sh credential-store --import-secret-key=imported --location=<path_to_credential_store> --type PropertiesCredentialStore

示例

$ EAP_HOME/bin/elytron-tool.sh credential-store --import-secret-key=imported --location "standalone/configuration/properties-credential-store.cs" --type PropertiesCredentialStore

列出所有凭证

您可以使用以下 WildFly Elytron 工具命令列出 PropertiesCredentialStore 中的凭证:

语法

$ EAP_HOME/bin/elytron-tool.sh credential-store --location "<path_to_store_file>"  --aliases --type PropertiesCredentialStore

示例

$ EAP_HOME/bin/elytron-tool.sh credential-store  --location "standalone/configuration/properties-credential-store.cs" --aliases --type PropertiesCredentialStore
Credential store contains following aliases: example

导出 SecretKeyCredential

您可以使用以下命令从 PropertiesCredentialStore 中导出 SecretKeyCredential:

语法

$ EAP_HOME/bin/elytron-tool.sh credential-store --export-secret-key=<alias> --location "<path_to_credential_store>"  --type PropertiesCredentialStore

示例

$ EAP_HOME/bin/elytron-tool.sh credential-store --export-secret-key=example --location "standalone/configuration/properties-credential-store.cs" --type PropertiesCredentialStore
Exported SecretKey for alias example=RUxZAUt1EZM7PsYRgMGypkGirSel+5Eix4aSgwop6jfxGYUQaQ==

删除凭证

您可以使用以下命令从凭证存储中删除凭证:

语法

$ EAP_HOME/bin/elytron-tool.sh credential-store --location "<path_to_store_file>" --remove <alias> --type PropertiesCredentialStore

示例

$ EAP_HOME/bin/elytron-tool.sh credential-store --location "standalone/configuration/properties-credential-store.cs"  --remove example --type PropertiesCredentialStore
Alias "example" has been successfully removed

4.1.5.6. 将使用 WildFly Elytron 工具创建的凭据存储添加到 JBoss EAP 服务器

使用 WildFly Elytron 工具创建了凭据存储后,您可以将其添加到正在运行的 JBoss EAP 服务器中。

先决条件

流程

  • 使用以下管理 CLI 命令,将凭证存储添加到正在运行的 JBoss EAP 服务器中:

    /subsystem=elytron/credential-store=<store_name>:add(location="<path_to_store_file>",credential-reference={clear-text=<store_password>})

    例如:

    /subsystem=elytron/credential-store=my_store:add(location="../cred_stores/example-credential-store.jceks",credential-reference={clear-text=storePassword})

将凭据存储添加到 JBoss EAP 配置后,您可以使用 credentials -reference 属性引用存储在凭据存储中的密码或敏感字符串。

如需更多信息,请使用 EAP_HOME/bin/elytron-tool.sh credential-store --help 命令获得可用选项的详细列表。

4.1.5.7. WildFly Elytron 工具密钥对管理操作

您可以使用以下参数来操作 elytron-tool.sh 来处理凭据存储,例如生成可在凭证存储中存储的新密钥对。

生成密钥对

使用 generate-key-pair 命令创建一个密钥对。然后您可以在凭证存储的别名下存储密钥对。以下示例显示了创建 RSA 密钥对,其分配大小为 3072 位,存储在为凭据存储指定的位置。提供给密钥对的别名是 example

$ EAP_HOME/bin/elytron-tool.sh credential-store --location=<path_to_store_file> --generate-key-pair example --algorithm RSA --size 3072
导入密钥对

使用 import-key-pair 命令将现有的 SSH 密钥对导入到带有指定别名的凭据存储中。以下示例导入一个密钥对,其别名 example 来自 /home/user/.ssh/id_rsa 文件,该文件包含采用 OpenSSH 格式的私钥:

$ EAP_HOME/bin/elytron-tool.sh credential-store --import-key-pair example --private-key-location /home/user/.ssh/id_rsa --location=<path_to_store_file>
导出密钥对

使用 export-key-pair-public-key 命令显示密钥对的公钥。公钥具有 OpenSSH 格式的指定别名。以下示例显示了别名 示例 的公钥:

$ EAP_HOME/bin/elytron-tool.sh credential-store --location=<path_to_store_file> --export-key-pair-public-key example

Credential store password:
Confirm credential store password:
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBMfncZuHmR7uglb0M96ieArRFtp42xPn9+ugukbY8dyjOXoi
cZrYRyy9+X68fylEWBMzyg+nhjWkxJlJ2M2LAGY=
注意

在发出 export-key-pair-public-key 命令后,会提示您输入凭证存储密码短语。如果不存在密码短语,请将提示留空。

4.1.5.8. 在 Elytron 配置文件中使用存储的密钥对示例

密钥对包含两个独立的,但匹配,加密密钥:公钥和私钥。您需要在凭证存储中存储密钥对,然后才能在 elytron 配置文件中引用密钥对。然后,您可以提供对 Git 的访问权限,以管理您的单机服务器配置数据。

以下示例引用了 elytron 配置文件的 <credential-stores> 元素中的凭证存储及其属性。<credential> 元素引用凭证存储和别名,用于存储密钥对。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <authentication-client xmlns="urn:elytron:client:1.6">

     <credential-stores>
        <credential-store name="${credential_store_name}">
           <protection-parameter-credentials>
              <clear-password password="${credential_store_password}"/>
           </protection-parameter-credentials>
           <attributes>
              <attribute name="path" value="${path_to_credential_store}"/>
           </attributes>
        </credential-store>
     </credential-stores>

     <authentication-rules>
        <rule use-configuration="${configuration_file_name}"/>
     </authentication-rules>

     <authentication-configurations>
        <configuration name="${configuration_file_name}">
           <credentials>
              <credential-store-reference store="${credential_store_name}" alias="${alias_of_key_pair}"/>
           </credentials>
        </configuration>
     </authentication-configurations>

  </authentication-client>
</configuration>

配置 elytron 配置文件后,密钥对可用于 SSH 身份验证。

4.1.5.9. 使用 WildFly Elytron 工具生成屏蔽的加密字符串

您可以使用 WildFly Elytron 工具来生成与 PicketBox 兼容的 MASK 加密字符串,而不使用凭据存储的纯文本密码。

流程

  • 要生成屏蔽的字符串,请使用以下命令,并为 salt 和迭代计数提供值:

    $ EAP_HOME/bin/elytron-tool.sh mask --salt <salt> --iteration <iteration_count> --secret <password>

    例如:

    $ EAP_HOME/bin/elytron-tool.sh mask --salt 12345678 --iteration 123 --secret supersecretstorepassword
    
    MASK-8VzWsSNwBaR676g8ujiIDdFKwSjOBHCHgnKf17nun3v;12345678;123

    如果您不想在 命令中提供 secret,可以省略该参数,系统将提示您使用标准输入输入 secret。

如需更多信息,请使用 EAP_HOME/bin/elytron-tool.sh mask --help 命令来获取可用选项的详细列表。

4.1.6. Elytron 中的加密表达式

要保持敏感字符串的保密性,您可以在服务器配置文件中使用加密表达式而不是敏感字符串。

加密的表达式是结果,从加密字符串与 SecretKeyCredential 进行加密,然后将它与其编码前缀和解析器名称合并。编码前缀告知 Elytron 表达式是一个加密的表达式。解析器将加密表达式映射到凭据存储中对应的 SecretKeyCredential。

Elytron 中的 expression=encryption 资源使用加密表达式来解码它在运行时内的加密字符串。通过在配置文件中使用加密表达式而不是敏感字符串本身,您可以保护字符串的保密。加密表达式采用以下格式:

使用特定解析器的语法

${ENC::RESOLVER_NAME:ENCRYPTED_STRING}

ENC 是表示加密表达式的前缀。

RESOLVER_NAME 是解析程序用来解密加密的字符串。

示例

${ENC::initialresolver:RUxZAUMQE+L5zx9LmCRLyh5fjdfl1WM7lhfthKjeoEU+x+RMi6s=}

如果您使用默认解析器创建加密表达式,如下所示:

使用默认解析器的语法

${ENC::ENCRYPTED_STRING}

示例

${ENC::RUxZAUMQE+L5zx9LmCRLyh5fjdfl1WM7lhfthKjeoEU+x+RMi6s=}

在这种情况下,Elytron 使用您在 expression=encryption 资源中定义的默认解析器来解密表达式。您可以在支持它的任何资源属性中使用加密表达式。要找出某个属性是否支持加密表达式,请使用 read-resource-description 操作,例如:

有关 mail/mail-session的 read-resource-description 示例

/subsystem=mail/mail-session=*/:read-resource-description(recursive=true,access-control=none)
{
  "outcome"=>"success",
  "result"=>[{
  ...
    "from"=>{
      ...
      "expression-allowed"=>true,
      ...
   }]
}

在本例中,属性 from 支持加密表达式。这意味着,您可以通过加密表达式在 from 字段中隐藏您的电子邮件地址。

4.1.7. 在 Elytron 中创建加密的表达式

从敏感字符串和 SecretKeyCredential 创建加密表达式。使用此加密表达式而不是管理模型中的敏感字符串 - 服务器配置文件,维护敏感字符串的保密性。

先决条件

流程

  1. 使用以下管理 CLI 命令,创建一个在凭证存储中引用现有 SecretKeyCredential 的别名的解析器:

    语法

    /subsystem=elytron/expression=encryption:add(resolvers=[{name=<name_of_the_resolver>, credential-store=<name_of_credential_store>, secret-key=<secret_key_alias>}])

    示例

    /subsystem=elytron/expression=encryption:add(resolvers=[{name=exampleResolver, credential-store=examplePropertiesCredentialStore, secret-key=key}])

    如果显示与重复资源相关的错误消息,请使用 list-add 操作而不是 add,如下所示:

    语法

    /subsystem=elytron/expression=encryption:list-add(name=resolvers, value={name=<name_of_the_resolver>, credential-store=<name_of_credential_store>, secret-key=<secret_key_alias>})

    示例

    /subsystem=elytron/expression=encryption:list-add(name=resolvers,value={name=exampleResolver, credential-store=examplePropertiesCredentialStore, secret-key=key})
    {
        "outcome" => "success",
        "response-headers" => {
            "operation-requires-reload" => true,
            "process-state" => "reload-required"
        }
    }

  2. 使用以下管理 CLI 命令重新载入服务器:

    reload
  3. 在管理 CLI 中禁用命令缓存:

    重要

    如果不禁用缓存,则可以访问管理 CLI 历史记录文件的任何人都可以看到 secret 密钥。

    history --disable
  4. 使用以下管理 CLI 命令创建一个加密表达式:

    语法

    /subsystem=elytron/expression=encryption:create-expression(resolver=<existing_resolver>, clear-text=<sensitive_string_to_protect>)

    示例

    /subsystem=elytron/expression=encryption:create-expression(resolver=exampleResolver, clear-text=TestPassword)
    {
        "outcome" => "success",
        "result" => {"expression" => "${ENC::exampleResolver:RUxZAUMQgtpG7oFlHR2j1Gkn3GKIHff+HR8GcMX1QXHvx2uGurI=}"}
    }

    ${ENC::exampleResolver:RUxZAUMQgtpG7oFlHR2j1Gkn3GKIHff+HR8GcMX1QXHvx2uGurI=} 是您在管理模型中使用的加密表达式,而不是在管理模型中使用 TestPassword

    如果您在不同的位置使用相同的纯文本,则每次使用加密的表达式而不是该位置中的纯文本前都会重复这个命令。当您为同一纯文本重复同一命令时,您可以获得同一键的不同结果,因为 Elytron 为每个调用使用唯一的初始化向量。

    通过使用不同的加密表达式,您必须确保字符串中的一个加密表达式受到某种程度的破坏,用户无法发现任何其他加密表达式也可能会包含相同的字符串。

  5. 使用以下管理 CLI 命令重新启用命令缓存:

    history --enable

4.1.8. 在 JBoss EAP 配置中使用密码凭证

要引用存储在凭证存储中的密码或敏感字符串,请使用 JBoss EAP 配置中的 credentials-reference 属性。您可以使用 credential-reference 作为在 JBoss EAP 配置中大多数位置提供密码或其他敏感字符串的替代选择。

先决条件

流程

  • credential-reference 属性中引用现有 KeyStore 和 PasswordCredential 的别名:

    语法

    credential-reference={store=<store_name>, alias=<alias>}

    示例

    data-source add --name=example_data_source --jndi-name=java:/example_data_source --driver-name=h2 --connection-url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE --user-name=db_user --credential-reference={store=exampleKeyStoreCredentialStore, alias=passwordCredentialAlias}
    16:17:23,024 INFO  [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-2) WFLYJCA0001: Bound data source [java:/example_data_source]

    在本例中,使用 KeyStoreCredentialStore exampleKeyStoreCredentialStore 中的别名为 passwordCredentialAlias 的一个已存在的 PasswordCredential,而不是使用明文形式的密码。这样可以包括数据库的密码。

4.1.9. 使用加密表达式来保护 KeyStore/credential-store

您可以使用加密表达式来保护 KeyStore。

先决条件

流程

  • 创建一个 KeyStoreCredentialStore,它使用加密表达式作为 明文

    语法

    /subsystem=elytron/credential-store=<name_of_credential_store>:add(path=<path_to_the_credential_store>, create=true, modifiable=true, credential-reference={clear-text=<encrypted_expression>})

    示例

    /subsystem=elytron/credential-store=secureKeyStoreCredentialStore:add(path="secureKeyStoreCredentialStore.jceks", relative-to=jboss.server.data.dir, create=true, modifiable=true, credential-reference={clear-text=${ENC::exampleResolver:RUxZAUMQgtpG7oFlHR2j1Gkn3GKIHff+HR8GcMX1QXHvx2uGurI=}})
    {"outcome" => "success"}

4.1.10. 自动更新凭证存储在凭证存储中

如果您有凭证存储,则不需要添加凭证或更新现有凭证,然后才能从凭证引用凭证引用它们。Elytron 实现此过程的自动化。配置凭证引用时,请同时指定 storeclear-text 属性。Elytron 会在 store 属性指定的凭证存储中自动添加或更新凭证。另外,您还可以指定 alias 属性。

Elytron 更新凭证存储,如下所示:

  • 如果您指定了别名:

    • 如果存在别名的条目,现有凭证会使用指定的明文密码替换。
    • 如果别名的条目不存在,则使用指定别名添加新条目,以及明文密码。
  • 如果您没有指定别名,Elytron 生成一个别名,并使用生成的别名和指定的明文密码添加新条目。

当凭证存储被更新时,clear-text 属性会从管理模型中删除。

以下示例演示了如何创建用来指定 store, clear-text, 和 alias 属性的凭证引用:

/subsystem=elytron/key-store=exampleKS:add(relative-to=jboss.server.config.dir, path=example.keystore, type=JCEKS, credential-reference={store=exampleKeyStoreCredentialStore, alias=myNewAlias, clear-text=myNewPassword})
{
    "outcome" => "success",
    "result" => {"credential-store-update" => {
        "status" => "new-entry-added",
        "new-alias" => "myNewAlias"
    }}
}

您可以使用以下命令将 myNewAlias 条目的凭证添加到之前定义的凭证存储中:

/subsystem=elytron/key-store=exampleKS:write-attribute(name=credential-reference.clear-text,value=myUpdatedPassword)
{
    "outcome" => "success",
    "result" => {"credential-store-update" => {"status" => "existing-entry-updated"}},
    "response-headers" => {
        "operation-requires-reload" => true,
        "process-state" => "reload-required"
    }
}
注意

如果包含 credentials-reference 参数的操作失败,则不会发生自动凭证存储更新。

credentials-reference 属性指定的凭据存储不会改变。

4.1.11. 定义 FIPS 140-2 兼容凭证存储

您可以使用网络安全服务(NSS)数据库,或使用 Bouncy Castle 提供者来定义联邦信息处理标准(FIPS)140-2 兼容凭证存储。

4.1.11.1. 使用 NSS 数据库定义 FIPS 140-2 兼容凭证存储

要获得联邦信息处理标准(FIPS)兼容密钥存储,请使用 Sun PKCS#11(PKCS 代表公共密钥 Cryptography Standards)供应商访问网络安全服务(NSS)数据库。有关定义数据库的步骤,请参阅配置 NSS 数据库

流程

  1. 创建要在凭据存储中使用的 secret 密钥。

    注意

    要使 keytool 命令正常工作,在 nss_pkcsll_fips.cfg 文件中,您必须将 nssDbMode 属性分配为 readWrite

    $ keytool -keystore NONE -storetype PKCS11 -storepass <keystore_password> -genseckey -alias <key_alias> -keyalg <key_algorithm> -keysize <key_size>
  2. 创建外部凭据存储。外部凭据存储在 PKCS#11 密钥存储中包含一个 secret 密钥,并使用上一步中定义的别名访问此密钥存储。然后,该密钥存储用于解密 Java Cryptography Extension Keystore(JCEKS)密钥存储中的凭据。除了 credential-store 属性外,Elytron 使用 credential-store KeyStore 实现属性来配置外部凭据存储。

    /subsystem=elytron/credential-store=<store_name>:add(modifiable=true, implementation-properties={"keyStoreType"=>"PKCS11", "external"=>"true", "keyAlias"=>"<key_alias>", externalPath="<path_to_JCEKS_file>"}, credential-reference={clear-text="<keystore_password>"}, create=true)
  3. 创建后,凭证存储可以正常存储别名。

    /subsystem=elytron/credential-store=<store_name>:add-alias(alias="<alias>", secret-value="<sensitive_string>")
  4. 从凭证存储中读取,确认已成功添加别名。

    /subsystem=elytron/credential-store=<store_name>:read-aliases()

4.1.11.2. 使用 Bouncy Castle 供应商定义 FIPS 140-2 兼容凭证存储

使用 Bouncy Castle 供应商定义联邦信息处理标准(FIPS)140-2 兼容凭证存储。

先决条件

流程

  1. 创建要在凭据存储中使用的 secret 密钥。

    $ keytool -genseckey -alias<key_alias> -keyalg <key_algorithm> -keysize <key_size> -keystore <path_to_keystore> -storetype BCFKS -storepass <key_and_keystore_password> -keypass <key_and_keystore_password>
    重要

    密钥存储的 keypassstorepass 必须相同,才能在 elytron 子系统中定义 FIPS 凭证存储。

  2. 创建外部凭据存储。外部凭据存储在 BCFKS 密钥存储中保存机密密钥,并使用上一步中定义的别名访问此密钥存储。然后,该密钥存储用于解密 JCEKS 密钥存储中的凭据。credential-store KeyStoreCredentialStore implementation properties 用于配置外部凭据存储。

    /subsystem=elytron/credential-store=<BCFKS_credential_store>:add(relative-to=jboss.server.config.dir,credential-reference={clear-text=<key_and_keystore_password>},implementation-properties={keyAlias=<key_alias>,external=true,externalPath=<path_to_credential_store>,keyStoreType=BCFKS},create=true,location=<path_to_keystore>,modifiable=true)
  3. 创建后,凭证存储可以正常存储别名。

    /subsystem=elytron/credential-store=<BCFKS_credential_store>:add-alias(alias="<alias>", secret-value="<sensitive_string>")
  4. 从凭证存储中读取,确认已成功添加别名。

    /subsystem=elytron/credential-store=<BCFKS_credential_store>:read-aliases()

4.1.12. 使用凭证存储的自定义实现

使用凭据存储的自定义实现。

流程

  1. 创建一个扩展 Service Provider Interface(SPI) CredentialStoreSpi 抽象类的类。
  2. 创建实施 Java Security Provider 的类。该提供程序必须将自定义凭据存储类添加为服务。
  3. 创建包含凭据存储和提供程序类的模块,并将它添加到 JBoss EAP 中,并依赖于 org.wildfly.security.elytron。例如:

    module add --name=org.jboss.customcredstore --resources=/path/to/customcredstoreprovider.jar --dependencies=org.wildfly.security.elytron --slot=main
  4. 为您的供应商创建一个供应商加载程序。例如:

    /subsystem=elytron/provider-loader=myCustomLoader:add(class-names=[org.wildfly.security.mycustomcredstore.CustomElytronProvider],module=org.jboss.customcredstore)
  5. 使用自定义实施创建凭据存储。

    注意

    确保指定正确的 providerstype 值。type 的值是供应商类中使用的,它为添加自定义凭据存储类添加为服务。

    例如:

    /subsystem=elytron/credential-store=my_store:add(providers=myCustomLoader,type=CustomKeyStorePasswordStore,location="cred_stores/my_store.jceks",relative-to=jboss.server.data.dir,credential-reference={clear-text=supersecretstorepassword},create=true)

    或者,如果您创建了多个供应商,您可以使用 other-providers 的另一个供应商加载程序来指定额外的供应商。这可让您对新类型凭证有其他的实现。这些指定的其他供应商可以在自定义凭据存储 初始化 方法中自动访问,作为 Provider[] 参数。例如:

    /subsystem=elytron/credential-store=my_store:add(providers=myCustomLoader,other-providers=myCustomLoader2,type=CustomKeyStorePasswordStore,location="cred_stores/my_store.jceks",relative-to=jboss.server.data.dir,credential-reference={clear-text=supersecretstorepassword},create=true)

4.1.13. 从外部来源获取凭证存储的密码

您可以选择使用伪凭证存储来提供密码,而不必以明文格式提供密码。

您可以使用以下提供密码的选项:

EXT

使用 java.lang.Runtime#exec(java.lang.String) 的外部命令。您可以使用空格分隔的字符串列表为命令提供参数。外部命令引用来自操作系统的任何可执行文件,如 shell 脚本或可执行的二进制文件。Elytron 从您运行的命令的标准输出中读取密码。

示例

credential-reference={clear-text="{EXT}/usr/bin/getThePasswordScript.sh par1 par2", type="COMMAND"}

CMD

使用 java.lang.ProcessBuilder 的外部命令.您可以使用以逗号分隔的字符串列表为命令提供参数。外部命令引用来自操作系统的任何可执行文件,如 shell 脚本或可执行的二进制文件。Elytron 从您运行的命令的标准输出中读取密码。

示例

credential-reference={clear-text="{CMD}/usr/bin/getThePasswordScript.sh par1,par2", type="COMMAND"}

掩码

使用 PBE 或基于密码的加密屏蔽密码。它必须采用以下格式,其中包括 SALTITERATION 值:

credential-reference={clear-text="MASK-MASKED_VALUE;SALT;ITERATION"}

示例

credential-reference={clear-text="MASK-NqMznhSbL3lwRpDmyuqLBW==;12345678;123"}

重要

EXTCMDMASK 提供与提供外部密码的传统安全库样式的向后兼容性。对于 MASK,您必须使用以上格式,包括 SALTITERATION 值。

您还可以使用位于另一凭证存储中的密码作为新凭据存储的密码。

使用来自 Another Credential Store 的密码创建的凭证示例

/subsystem=elytron/credential-store=exampleCS:add(location="cred_stores/exampleCS.jceks", relative-to=jboss.server.data.dir, create=true, credential-reference={store=cred-store, alias=pwd})

4.1.14. 为 JBoss EAP 提供初始密钥以解锁安全资源

为安全起见,一些 JBoss EAP 组件会受 PasswordCredential in KeyStore 来保护。此 KeyStoreStore 由存储在 JBoss EAP 外部的 secret 密钥进行保护。这称为 master 密钥。JBoss EAP 在启动过程中 使用这个 主密钥来解锁 KeyStoreCredentialStore,以获取存储在 KeyStoreCredentialStore 中的 PasswordCredential。

您可以使用 Elytron 中的 PropertiesCredentialStore 来提供 master 密钥。另外,您还可以从外部来源获取 master 密钥或密码。有关从外部源获取密码的信息,请参阅 获取来自外部来源的凭据存储的密码

4.1.14.1. 为独立服务器创建 PropertiesCredentialStore/secret-key-credential-store

使用管理 CLI 创建 PropertiesCredentialStore。在创建 PropertiesCredentialStore 时,JBoss EAP 默认生成 secret key。生成的密钥的名称是 key,其大小为 256 位。

先决条件

  • 您至少提供对运行 JBoss EAP 的用户帐户的 PropertiesCredentialStore 的目录的读/写权限。

流程

  • 使用以下命令,使用管理 CLI 创建 PropertiesCredentialStore:

    语法

    /subsystem=elytron/secret-key-credential-store=<name_of_credential_store>:add(path="<path_to_the_credential_store>", relative-to=<path_to_store_file>)

    示例

    /subsystem=elytron/secret-key-credential-store=examplePropertiesCredentialStore:add(path=examplePropertiesCredentialStore.cs, relative-to=jboss.server.config.dir)
    {"outcome" => "success"}

4.1.14.2. 在 Elytron 中创建加密的表达式

从敏感字符串和 SecretKeyCredential 创建加密表达式。使用此加密表达式而不是管理模型中的敏感字符串 - 服务器配置文件,维护敏感字符串的保密性。

先决条件

流程

  1. 使用以下管理 CLI 命令,创建一个在凭证存储中引用现有 SecretKeyCredential 的别名的解析器:

    语法

    /subsystem=elytron/expression=encryption:add(resolvers=[{name=<name_of_the_resolver>, credential-store=<name_of_credential_store>, secret-key=<secret_key_alias>}])

    示例

    /subsystem=elytron/expression=encryption:add(resolvers=[{name=exampleResolver, credential-store=examplePropertiesCredentialStore, secret-key=key}])

    如果显示与重复资源相关的错误消息,请使用 list-add 操作而不是 add,如下所示:

    语法

    /subsystem=elytron/expression=encryption:list-add(name=resolvers, value={name=<name_of_the_resolver>, credential-store=<name_of_credential_store>, secret-key=<secret_key_alias>})

    示例

    /subsystem=elytron/expression=encryption:list-add(name=resolvers,value={name=exampleResolver, credential-store=examplePropertiesCredentialStore, secret-key=key})
    {
        "outcome" => "success",
        "response-headers" => {
            "operation-requires-reload" => true,
            "process-state" => "reload-required"
        }
    }

  2. 使用以下管理 CLI 命令重新载入服务器:

    reload
  3. 在管理 CLI 中禁用命令缓存:

    重要

    如果不禁用缓存,则可以访问管理 CLI 历史记录文件的任何人都可以看到 secret 密钥。

    history --disable
  4. 使用以下管理 CLI 命令创建一个加密表达式:

    语法

    /subsystem=elytron/expression=encryption:create-expression(resolver=<existing_resolver>, clear-text=<sensitive_string_to_protect>)

    示例

    /subsystem=elytron/expression=encryption:create-expression(resolver=exampleResolver, clear-text=TestPassword)
    {
        "outcome" => "success",
        "result" => {"expression" => "${ENC::exampleResolver:RUxZAUMQgtpG7oFlHR2j1Gkn3GKIHff+HR8GcMX1QXHvx2uGurI=}"}
    }

    ${ENC::exampleResolver:RUxZAUMQgtpG7oFlHR2j1Gkn3GKIHff+HR8GcMX1QXHvx2uGurI=} 是您在管理模型中使用的加密表达式,而不是在管理模型中使用 TestPassword

    如果您在不同的位置使用相同的纯文本,则每次使用加密的表达式而不是该位置中的纯文本前都会重复这个命令。当您为同一纯文本重复同一命令时,您可以获得同一键的不同结果,因为 Elytron 为每个调用使用唯一的初始化向量。

    通过使用不同的加密表达式,您必须确保字符串中的一个加密表达式受到某种程度的破坏,用户无法发现任何其他加密表达式也可能会包含相同的字符串。

  5. 使用以下管理 CLI 命令重新启用命令缓存:

    history --enable

4.1.14.3. 使用加密表达式来保护 KeyStore/credential-store

您可以使用加密表达式来保护 KeyStore。

先决条件

流程

  • 创建一个 KeyStoreCredentialStore,它使用加密表达式作为 明文

    语法

    /subsystem=elytron/credential-store=<name_of_credential_store>:add(path=<path_to_the_credential_store>, create=true, modifiable=true, credential-reference={clear-text=<encrypted_expression>})

    示例

    /subsystem=elytron/credential-store=secureKeyStoreCredentialStore:add(path="secureKeyStoreCredentialStore.jceks", relative-to=jboss.server.data.dir, create=true, modifiable=true, credential-reference={clear-text=${ENC::exampleResolver:RUxZAUMQgtpG7oFlHR2j1Gkn3GKIHff+HR8GcMX1QXHvx2uGurI=}})
    {"outcome" => "success"}

使用加密表达式保护 KeyStoreCredentialStore 后,您可以在 KeyStoreCredentialStore 中生成 SecretKeyCredential,并使用 secret 密钥来创建另一个加密表达式。然后,您可以使用这个新加密表达式而不是管理模型中的敏感字符串 - 服务器配置文件。您可以创建整个凭证存储链以提高安全性。这样链可以更难以猜测敏感字符串,因为字符串会按照以下方式进行保护:

  • 第一个加密表达式为 KeyStoreCredentialStore 的安全。
  • 另一个加密表达式保护敏感字符串。
  • 要解码敏感字符串,您需要解密加密的表达式。

随着加密表达式的链变得较长,解密敏感字符串会变得比较困难。

4.1.15. 将密码库转换为凭证存储

您可以使用 WildFly Elytron 工具将密码 vault 转换为凭据存储。要将密码库转换为凭据存储,您需要在初始化 vault 时使用的 vault 值

注意

在转换密码 vault 时,新凭证存储中的别名根据对应的密码 vault 块和属性名称命名:::AULT _BLOCK ::ATTRIB UTE_NAME

4.1.15.1. 使用 WildFly Elytron 工具将单个密码库转换为凭据存储

使用 WildFly Elytron 工具将单个密码 vault 转换为凭据存储。

流程

  • 使用以下命令将密码 vault 转换为凭证存储:

    $ EAP_HOME/bin/elytron-tool.sh vault --keystore "<path_to_vault_file>" --keystore-password <vault_password> --enc-dir "<path_to_vault_directory>" --salt <salt> --iteration <iteration_count> --alias <vault_alias>

    例如,您也可以使用 --location 参数指定新凭证存储的文件名和位置:

    $ EAP_HOME/bin/elytron-tool.sh vault --keystore ../vaults/vault.keystore --keystore-password vault22 --enc-dir ../vaults/ --salt 1234abcd --iteration 120 --alias my_vault --location ../cred_stores/my_vault_converted.cred_store
注意

您还可以使用 --summary 参数显示用于转换的管理 CLI 命令的摘要。请注意,即使使用了纯文本密码,它也会在摘要输出中屏蔽。使用默认的 salt迭代 值,除非在命令中指定。

4.1.15.2. 使用 WildFly Elytron 工具批量将密码 vault 转换为凭证存储

批量将多个密码库转换为凭据存储。

流程

  1. 将您要转换为描述文件的库的详情采用以下格式:

    keystore:<path_to_vault_file>
    keystore-password:<vault_password>
    enc-dir:<path_to_vault_directory>
    salt:<salt> 1
    iteration:<iteration_count>
    location:<path_to_converted_cred_store> 2
    alias:<vault_alias>
    properties:<parameter1>=<value1>;<parameter2>=<value2>; 3
    1
    如果您为 vault 提供纯文本密码,则可以省略 saltiteration
    2
    指定转换凭证存储的位置和文件名。
    3
    可选:指定以分号(;)分隔的可选参数列表。如需可用参数的列表,请参阅 EAP_HOME/bin/elytron-tool.sh vault --help

    例如:

    keystore:/vaults/vault1/vault1.keystore
    keystore-password:vault11
    enc-dir:/vaults/vault1/
    salt:1234abcd
    iteration:120
    location:/cred_stores/vault1_converted.cred_store
    alias:my_vault
    
    keystore:/vaults/vault2/vault2.keystore
    keystore-password:vault22
    enc-dir:/vaults/vault2/
    salt:abcd1234
    iteration:130
    location:/cred_stores/vault2_converted.cred_store
    alias:my_vault2
  2. 使用上一步中的描述文件运行批量转换命令:

    $ EAP_HOME/bin/elytron-tool.sh vault --bulk-convert vaultdescriptions.txt

如需更多信息,请使用 EAP_HOME/bin/elytron-tool.sh vault --help 命令来获取可用选项的详细列表。

4.1.16. 使用 Elytron 客户端的凭证存储示例

连接到 JBoss EAP(如 Jakarta Enterprise Bean)的客户端可以使用 Elytron 客户端进行身份验证。无法访问正在运行的 JBoss EAP 服务器的用户可以使用 WildFly Elytron 工具创建和修改凭据存储,然后客户端可以使用 Elytron 客户端访问凭据存储中的敏感字符串。

以下示例演示了如何在 Elytron 客户端配置文件中使用凭据存储。

带有 Credential Store 的 custom-config.xml 示例

<configuration>
  <authentication-client xmlns="urn:elytron:client:1.2">
    ...
    <credential-stores>
      <credential-store name="my_store"> 1
        <protection-parameter-credentials>
          <credential-store-reference clear-text="pass123"/> 2
        </protection-parameter-credentials>
        <attributes>
          <attribute name="location" value="/path/to/my_store.jceks"/> 3
        </attributes>
      </credential-store>
    </credential-stores>
    ...
    <authentication-configurations>
      <configuration name="my_user">
        <set-host name="localhost"/>
        <set-user-name name="my_user"/>
        <set-mechanism-realm name="ManagementRealm"/>
        <use-provider-sasl-factory/>
        <credentials>
          <credential-store-reference store="my_store" alias="my_user"/> 4
        </credentials>
      </configuration>
    </authentication-configurations>
    ...
  </authentication-client>
</configuration>

1
用于在 Elytron 客户端配置文件中使用的凭证存储名称。
2
凭据存储的密码。
3
凭证存储文件的路径。
4
存储在凭据存储中的敏感字符串的凭据引用。