Самое простое решение - уронить контейнер, но это не всегда желательно. Однако есть другой способ.
AFAIK, x509.sh должен запускаться только один раз за время жизни контейнера. Вы можете ознакомиться с entrypoint.sh в репозитории, чтобы убедиться, что x509.sh запускается только при инициализации контейнера и никогда больше. В предыдущих версиях docker-entrypoint.sh, x509.sh запускался при каждом запуске, но он ничего не делал, несмотря на сообщения, которые он печатал.
Текущая версия x509.sh - достижение следующих шагов:
генерация случайного пароля:
local PASSWORD=$(openssl rand -base64 32 2>/dev/null)
создание хранилища ключей PKCS12 с помощью openssl:
openssl pkcs12 -export \
-name "${NAME}" \
-inkey "${X509_KEYSTORE_DIR}/${X509_KEY}" \
-in "${X509_KEYSTORE_DIR}/${X509_CRT}" \
-out "${KEYSTORES_STORAGE}/${PKCS12_KEYSTORE_FILE}" \
-password pass:"${PASSWORD}" >& /dev/null
создание хранилища ключей JKS из PKCS12 с помощью keytool:
keytool -importkeystore -noprompt \
-srcalias "${NAME}" -destalias "${NAME}" \
-srckeystore "${KEYSTORES_STORAGE}/${PKCS12_KEYSTORE_FILE}" \
-srcstoretype pkcs12 \
-destkeystore "${KEYSTORES_STORAGE}/${JKS_KEYSTORE_FILE}" \
-storepass "${PASSWORD}" -srcstorepass "${PASSWORD}" >& /dev/null
настройка хранилища ключей JKS для Keycloak:
$JBOSS_HOME/bin/jboss-cli.sh --file=/opt/jboss/tools/cli/x509-keystore.cli >& /dev/null
Если вы измените x509.sh и удалите все перенаправления на / dev / null, вы должны увидеть что-то вроде этого:
Creating HTTPS keystore via OpenShift's service serving x509 certificate secrets..
Importing keystore /opt/jboss/keycloak/standalone/configuration/keystores/https-keystore.pk12 to /opt/jboss/keycloak/standalone/configuration/keystores/https-keystore.jks...
keytool error: java.io.IOException: keystore password was incorrect
HTTPS keystore successfully created at: /opt/jboss/keycloak/standalone/configuration/keystores/https-keystore.jks
{
"outcome" => "failed",
"failure-description" => "WFLYCTL0212: Duplicate resource [
(\"subsystem\" => \"elytron\"),
(\"key-store\" => \"kcKeyStore\")
]",
"rolled-back" => true
}
{
"outcome" => "failed",
"failure-description" => "WFLYCTL0212: Duplicate resource [
(\"subsystem\" => \"elytron\"),
(\"key-store\" => \"kcKeyStore\")
]",
"rolled-back" => true
}
Не удалось изменить конфигурацию Keycloak с помощью jboss-cli.sh. Если вы просто удалите хранилища ключей и запустите x509.sh, новый случайно сгенерированный пароль будет отличаться от пароля в файле конфигурации Keycloak. Поскольку x509-keystore.cli пытается добавить параметры, а не обновлять их, пароль в хранилище ключей и пароль в конфигурации не совпадают.
Вот альтернативная версия x509.sh только для продления, ключевые моменты которой представлены ниже:
извлечь текущий пароль из конфигурации Keycloak:
local PASSWORD=$(/opt/jboss/keycloak/bin/jboss-cli.sh --connect --output-json '/subsystem=elytron/key-store=kcKeyStore:read-attribute(name="credential-reference")' |sed -rn 's;.+"result" *: *\{"clear-text" *: *"([^"]+)".*;\1;p')
извлеките путь к хранилищу ключей JKS из конфигурации Keycloak:
local JKS_KEYSTORE_PATH=$(/opt/jboss/keycloak/bin/jboss-cli.sh --connect --output-json '/subsystem=elytron/key-store=kcKeyStore:read-attribute(name="path")' |sed -rn 's;.+"result" *: *"([^"]+https[^"]+)".*;\1;p')
Предположим, что хранилище ключей PKCS12 отличается только своим расширением:
local PKCS12_KEYSTORE_PATH=${JKS_KEYSTORE_PATH%.*}.pk12
теперь, когда вы знаете пароль и пути к хранилищу ключей, обновите хранилище ключей PKCS12:
openssl pkcs12 -export \
-name "${NAME}" \
-inkey "${X509_KEYSTORE_DIR}/${X509_KEY}" \
-in "${X509_KEYSTORE_DIR}/${X509_CRT}" \
-out "${PKCS12_KEYSTORE_PATH}" \
-password pass:"${PASSWORD}"
наконец обновите JKS:
keytool -importkeystore -noprompt \
-srcalias "${NAME}" -destalias "${NAME}" \
-srckeystore "${PKCS12_KEYSTORE_PATH}" \
-srcstoretype pkcs12 \
-destkeystore "${JKS_KEYSTORE_PATH}" \
-storepass "${PASSWORD}" -srcstorepass "${PASSWORD}"
Полный сценарий:
function check_var() {
local name=$1
local value=$2
if [ -z "$value" ]; then
echo "$name is not defined."
exit 1
fi
}
function autoregenerate_keystore() {
# Keystore infix notation as used in templates to keystore name mapping
declare -A KEYSTORES=( ["https"]="HTTPS" )
local KEYSTORE_TYPE=$1
check_var "KEYSTORE_TYPE" $KEYSTORE_TYPE
# reading password from configuration
local PASSWORD=$(/opt/jboss/keycloak/bin/jboss-cli.sh --connect --output-json '/subsystem=elytron/key-store=kcKeyStore:read-attribute(name="credential-reference")' |sed -rn 's;.+"result" *: *\{"clear-text" *: *"([^"]+)".*;\1;p')
check_var "PASSWORD" $PASSWORD
# reading jks keystore path from configuration
local JKS_KEYSTORE_PATH=$(/opt/jboss/keycloak/bin/jboss-cli.sh --connect --output-json '/subsystem=elytron/key-store=kcKeyStore:read-attribute(name="path")' |sed -rn 's;.+"result" *: *"([^"]+'$KEYSTORE_TYPE'[^"]+)".*;\1;p')
check_var "JKS_KEYSTORE_PATH" $JKS_KEYSTORE_PATH
if [ ! -f "${JKS_KEYSTORE_PATH}" ]; then
echo "JKS keystore file does not exist!"
exit 1
fi
# supposing that keystores were generated by x509.sh, hence pk12 keystore is in the same location.
local PKCS12_KEYSTORE_PATH=${JKS_KEYSTORE_PATH%.*}.pk12
if [ ! -f "${PKCS12_KEYSTORE_PATH}" ]; then
echo "PKCS12 keystore file does not exist!"
exit 1
fi
local X509_KEYSTORE_DIR="/etc/x509/${KEYSTORE_TYPE}"
local X509_CRT="tls.crt"
local X509_KEY="tls.key"
local NAME="keycloak-${KEYSTORE_TYPE}-key"
if [ ! -f "${X509_KEYSTORE_DIR}/${X509_KEY}" ] || [ ! -f "${X509_KEYSTORE_DIR}/${X509_CRT}" ]; then
echo "X509 files does not exist!"
exit 1
fi
echo "Renewing ${KEYSTORES[$KEYSTORE_TYPE]} keystore via OpenShift's service serving x509 certificate secrets.."
openssl pkcs12 -export \
-name "${NAME}" \
-inkey "${X509_KEYSTORE_DIR}/${X509_KEY}" \
-in "${X509_KEYSTORE_DIR}/${X509_CRT}" \
-out "${PKCS12_KEYSTORE_PATH}" \
-password pass:"${PASSWORD}"
keytool -importkeystore -noprompt \
-srcalias "${NAME}" -destalias "${NAME}" \
-srckeystore "${PKCS12_KEYSTORE_PATH}" \
-srcstoretype pkcs12 \
-destkeystore "${JKS_KEYSTORE_PATH}" \
-storepass "${PASSWORD}" -srcstorepass "${PASSWORD}"
}
autoregenerate_keystore "https"
Назовите его, например, x509-renewal.sh и скопируйте в свой контейнер:
$ docker cp x509-renewal.sh my-keycloak-container:/opt/jboss/tools/
затем запустите его:
$ docker exec my-keycloak-container /opt/jboss/tools/x509-renewal.sh
Renewing HTTPS keystore via OpenShift's service serving x509 certificate secrets..
Importing keystore /opt/jboss/keycloak/standalone/configuration/keystores/https-keystore.pk12 to /opt/jboss/keycloak/standalone/configuration/keystores/https-keystore.jks...
Warning: Overwriting existing alias keycloak-https-key in destination keystore
person
Broija
schedule
22.10.2020