Программный доступ к паролю из хранилища Elytron
Я использую Elytron на WildFly 12 для хранения закодированного пароля источника данных.
Я использую следующие команды CLI для хранения пароля:
/subsystem=elytron/credential-store=ds_credentials:add( \
location="credentials/csstore.jceks", \
relative-to=jboss.server.data.dir, \
credential-reference={clear-text="changeit"}, \
create=true)
/subsystem=datasources/data-source=mydatasource/:undefine-attribute(name=password)
/subsystem=elytron/credential-store=ds_credentials:add-alias(alias=db_password, \
secret-value="datasource_password_clear_text")
/subsystem=datasources/data-source=mydatasource/:write-attribute( \
name=credential-reference, \
value={store=ds_credentials, alias=db_password})
Это работает очень хорошо до сих пор. Теперь мне нужен способ чтения этого пароля программно, чтобы я мог создать дамп базы данных PostgreSQL.
1 ответ
Я нашел возможность, но как-то похоже на неправильное решение.
static final String DB_PASS_ALIAS = "db_password/passwordcredential/clear/";
File keystoreFile = new File(System.getProperty("jboss.server.data.dir"),
"credentials/csstore.jceks");
// Open keystore
InputStream keystoreStream = new FileInputStream(keystoreFile);
KeyStore keystore = KeyStore.getInstance("JCEKS");
keystore.load(keystoreStream, KEYSTORE_PASS.toCharArray());
// Check if password for alias is available
if (!keystore.containsAlias(DB_PASS_ALIAS)) {
throw new RuntimeException("Alias for key not found");
}
// Get password
Key key = keystore.getKey(DB_PASS_ALIAS, KEYSTORE_PASS.toCharArray());
// Decode password - remove offset from decoded string
final String password = new String(key.getEncoded(), 2, key.getEncoded().length - 2);
Я открыт для любых лучших решений.