Keycloak SSL продлить сертификат certbot

У меня есть система SSL keycloak (docker), работающая с сертификатом, созданным certbot, но после обновления сертификата экземпляр keycloak по-прежнему показывает недействительный устаревший сертификат. Я проверил с помощью openssl, что созданный мной сертификат действителен и находится в папке / etc / x509 / https. разрешения на файлы в порядке. Я даже попробовал следующее, но ничего не заставило его забрать новый сертификат

  1. перезапуск Keycloak
  2. вход в экземпляр докера keycloak и запуск /opt/jboss/tools/x509.sh - в нем говорится, что он регенерировал новый набор файлов, но отметка даты, похоже, подразумевала, что это все еще старые .jks и .pk12
  3. переместил этот файл из / opt / jboss / keycloak / standalone / configuration / keystores в новую временную папку, снова запустил x509.sh и создал два новых файла. Я перезапустил экземпляр докера - но снова он все еще показывает старые даты сертификата

Кто-нибудь понял, почему старый сертификат не обновляется? Я считаю, что это скорее вопрос о ключе, чем о certbot. Любая помощь будет оценена по достоинству.


person NoToy    schedule 04.10.2020    source источник


Ответы (1)


Самое простое решение - уронить контейнер, но это не всегда желательно. Однако есть другой способ.

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