© 2021 The original authors.

1. Introduction

Since the initial development of JBoss AS7 the features added to WildFly have been continuing to increase, some of the older features are now being removed to make way for new features. This guide contains information about the removed features and their alternatives.

2. PicketBox Vault

WildFly Elytron has made available a new credential store which replaces the PicketBox vault. The credential store can be used for credentials to be directly looked up for use by resources or it can be used to store a SecretKey which can be used by an expression resolver to decrypt previously encrypted expressions in the management model.

2.1. Credential Store Creation

Before credentials can be added a new credential store needs to be created.

2.1.1. From the command line

The first option is to use the Elytron command line utility to create a new store.

bin/elytron-tool.sh credential-store --create \
    --location=standalone/configuration/credentials.store
Credential store password:
Confirm credential store password:
Credential Store has been successfully created

The creation process prompts for a password for the store twice and automatically creates the store.

2.1.2. Defining the credential store in the management model

This newly created credential store can be added to the management model of a running server.

/subsystem=elytron/credential-store=mystore:add( \
    relative-to=jboss.server.config.dir, \
    location=credentials.store, \
    credential-reference={clear-text=cs_password})
{"outcome" => "success"}

Instead of using the clear text password it is also possible to obfuscate the password using the mask command in the command line tool.

bin/elytron-tool.sh mask --secret=cs_password --salt=12345678 --iteration=256
MASK-0BjKFw41KSAGZr/OtiZNI1;12345678;256

The credential store resource can then be defined as.

/subsystem=elytron/credential-store=mystore:add( \
    relative-to=jboss.server.config.dir, \
    location=credentials.store, \
    credential-reference={clear-text=MASK-0BjKFw41KSAGZr/OtiZNI1;12345678;256})
{"outcome" => "success"}

2.1.3. Automatically creating the store

If the credential store file did not already exist, with a small change to the add operation the store will be automatically created for you.

/subsystem=elytron/credential-store=mystore:add( \
    relative-to=jboss.server.config.dir,
    location=credentials.store,
    credential-reference={clear-text=cs_password}, \
    create=true)
{"outcome" => "success"}

2.2. Adding Credentials

However the store was created credentials can be added using either the command line utility or a management operation. If using the command line utility it is recommended that this is performed when no running server is using the store to prevent accidental overwrites.

2.2.1. From the command line

The following command will add a new entry to the store under the alias example.

bin/elytron-tool.sh credential-store --add=example \
    --location=standalone/configuration/credentials.store
Credential store password:
Secret to store:
Confirm secret to store:
Alias "example" has been successfully stored

This command prompts for the credential store password once followed by promting for the secret to store twice.

2.2.2. Using a management operation

The following management operation can add an entry to the credential store:

history --disable
/subsystem=elytron/credential-store=mystore:add-alias(alias=example, \
    secret-value=example_password)
{"outcome" => "success"}
history --enable

In this example the CLI history is temporarily disabled to prevent the password being stored in the history file.

2.3. Listing credential store contents

The command line tool and management operations can both be used to list the contents of the credential store.

2.3.1. From the command line

The aliases in the credential store can be listed with the following command:

bin/elytron-tool.sh credential-store --aliases \
    --location=standalone/configuration/credentials.store
Credential store password:
Credential store contains following aliases: example

2.3.2. Using a management operation

The read-aliases management operation can be used with a credential store to list the aliases it contains.

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

2.4. Vault Conversion

The WildFly Elytron tool can also be used to convert an existing vault to a credential store.

bin/elytron-tool.sh vault --enc-dir standalone/configuration/vault \
    --keystore standalone/configuration/vault.keystore \
    --location standalone/configuration/converted.store
Vault password:
Confirm vault password:
Vault (enc-dir="standalone/configuration/vault";keystore="standalone/configuration/vault.keystore") \
    converted to credential store "standalone/configuration/converted.store"

This will convert all of the contents of the vault to a new credential store. Vault entries were identified using a BLOCK and a NAME, the resulting alias in the credential store will be in the format BLOCK::NAME.

2.5. Referencing a credential store credential

Resources in the management model which can reference credentials from the credential store use a credential-reference attribute, in defining the credential store previously this was used with a clear-password but it can also be used to reference an alias stored within a credential store.

The following managment operation demonstrates defining a new key-store resource using a credential store entry for the password.

/subsystem=elytron/key-store=test-store:add( \
    relative-to=jboss.server.config.dir, \
    path=test.keystore, required=false, \
    credential-reference={store=mystore, alias=example})
{"outcome" => "success"}

2.6. Encrypted Expressions

In addition to using direct references to credentials it is also possible to use a SecretKey to handle previously encrypted expressions directly within the management model.

2.6.1. Adding a SecretKey to a credential store

Before encrypted expressions can be used an AES SecretKey is required. The previous vault password making made use of a well known password for obfuscating, by using a SecretKey instead users can manage their own key.

From the command line

A SecretKey can be added to the credential store with the following command:

bin/elytron-tool.sh credential-store --generate-secret-key=key \
    --location standalone/configuration/credentials.store
Credential store password:
Alias "key" has been successfully stored
Using a management operation

The following management operation can also add a dynamically generated SecretKey:

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

2.6.2. Using a secret-key-credential-store

Alternatively it may be desirable to manage a SecretKey which is not itself password protected. An alternative resource is available for this:

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

This command will have also populated the new store with a SecretKey under the alias key.

2.6.3. Adding the expression resolver resource

A new resource can be added to the elytron subsystem which is responsible for handling encrypted expressions.

/subsystem=elytron/expression=encryption:add( \
    resolvers=[{name=default, \
                credential-store=secret-key-store, \
                secret-key=key}], \
    default-resolver=default)
{"outcome" => "success"}

2.6.4. Creating an expression

The easiest way to create an encrupted expression is using a management operation as the result takes into account the configured expression=encryption resource.

history --disable
/subsystem=elytron/expression=encryption:create-expression(clear-text=my_password)
{
    "outcome" => "success",
    "result" => {"expression" => "${ENC::RUxZAUMQ5Z7mXbyrCtv2kZlwHHpyJ//ma49gMAUnbmTfv2pGs30=}"}
}

history --enable

The resulting expression ${ENC::RUxZAUMQ5Z7mXbyrCtv2kZlwHHpyJ//ma49gMAUnbmTfv2pGs30=} can now be used as the value for any other attribute in the management model which supports expressions.

2.7. Further Reading

The WildFly Elytron Security guide contains further information regarding Credential Stores and Encrypted Expressions.