Настройка SSL Keycloak с использованием образа докера

Я пытаюсь развернуть keycloak с помощью образа докера ( https://hub.docker.com/r/jboss/keycloak/ версия 4.5.0-Final) и столкнулся с проблемой настройки SSL.

Согласно документам

Образ Keycloak позволяет указать как закрытый ключ, так и сертификат для обслуживания HTTPS. В этом случае вам нужно предоставить два файла:

tls.crt - сертификат tls.key - закрытый ключ. Эти файлы должны быть смонтированы в каталоге /etc/x509/https. Изображение автоматически преобразует их в хранилище ключей Java и реконфигурирует Wildfly для его использования.

Я выполнил указанные шаги и предоставил настройку тома для монтирования в папке с необходимыми файлами (tls.crt и tls.key), но я сталкиваюсь с проблемами с рукопожатием SSL, получая

ERR_SSL_VERSION_OR_CIPHER_MISMATCH

ошибка, блокирующая загрузку keycloak в браузере при попытке доступа к нему.

Я использовал letsencrypt для генерации файлов pem и использовал openssl для создания файлов.crt и.key. Также попытался просто openssl для создания этих файлов, чтобы сузить проблему и поведение такое же (некоторая дополнительная информация, если это имеет значение)

По умолчанию, когда я просто указываю только привязку порта -p 8443:8443 без указания монтирования тома cert /etc/x509/https, сервер keycloak генерирует самозаверяющий сертификат, и я не вижу проблем при просмотре приложения в браузере.

Я думаю, что это может быть больше проблема создания сертификата, чем что-либо специфическое для keycloak, но не знаете, как заставить это работать. Любая помощь приветствуется

1 ответ

Решение

После некоторых исследований сработал следующий метод (для самозаверяющих сертификатов мне все еще нужно выяснить, как поступить с letsencrypt CA for prod)

создать самоподписанный сертификат с помощью keytool

keytool -genkey -alias localhost -keyalg RSA -keystore keycloak.jks -validity 10950

конвертировать.jks в.p12

keytool -importkeystore -srckeystore keycloak.jks -destkeystore keycloak.p12 -deststoretype PKCS12

создать.crt из хранилища ключей.p12

openssl pkcs12 -in keycloak.p12 -nokeys -out tls.crt

генерировать.key из.p12 хранилища ключей

openssl pkcs12 -in keycloak.p12 -nocerts -nodes -out tls.key

Затем используйте tls.crt и tls.key для монтирования тома /etc/x509/https

Также в приложении безопасности в файле keycloak.json укажите следующие свойства

"truststore" : "path/to/keycloak.jks",
"truststore-password" : "<jks-pwd>",

Еще я столкнулся с проблемой получения ERR_SSL_VERSION_OR_CIPHER_MISMATCHошибка, используя образ Docker jboss / keycloak и бесплатные сертификаты от letsencrypt. Даже после рассмотрения советов из других комментариев. Теперь у меня есть рабочая (и довольно простая) установка, которая также может вам помочь.

1) Создать сертификат letsencrypt

Сначала я сгенерировал свой сертификат letsencrypt для домена sub.example.comиспользуя certbot. Вы можете найти подробные инструкции и альтернативные способы получения сертификата на https://certbot.eff.org/ и руководство пользователя на https://certbot.eff.org/docs/using.html.

$ sudo certbot certonly --standalone
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Please enter in your domain name(s) (comma and/or space separated)  (Enter 'c' to cancel): sub.example.com
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for sub.example.com
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/sub.example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/sub.example.com/privkey.pem
   Your cert will expire on 2020-01-27. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"

2) Подготовить среду для создания докеров

я использую docker-composeдля запуска keycloak через докер. Файлы конфигурации и данных хранятся по пути/srv/docker/keycloak/.

  • Папка config содержит docker-compose.yml
  • Папка data/certs содержит сертификаты, созданные мной с помощью letsencrypt
  • Папка data/keycloack_db сопоставляется с контейнером базы данных, чтобы его данные были постоянными.

Поместите файлы сертификатов по правильному пути

Когда у меня впервые возникли проблемы с использованием исходных сертификатов Letcrypt для keycloak, я попробовал обходной путь преобразования сертификатов в другой формат, как упоминалось в комментариях к предыдущим ответам, что также не удалось. В конце концов я понял, что моя проблема была вызвана разрешениями, установленными для сопоставленных файлов сертификатов.

Итак, у меня сработало просто скопировать и переименовать файлы, предоставленные letsencrypt, и смонтировать их в контейнер.

$ cp /etc/letsencrypt/live/sub.example.com/fullchain.pem /srv/docker/keycloak/data/certs/tls.crt
$ cp /etc/letsencrypt/live/sub.example.com/privkey.pem /srv/docker/keycloak/data/certs/tls.key
$ chmod 755 /srv/docker/keycloak/data/certs/
$ chmod 604 /srv/docker/keycloak/data/certs/*

docker-compose.yml

В моем случае мне нужно было использовать хост-сеть моего хоста докеров. Это не лучшая практика и в вашем случае не требуется. Информацию о параметрах конфигурации можно найти в документации по адресу https://hub.docker.com/r/jboss/keycloak/.

version: '3.7'

networks:
  default:
    external:
      name: host

services:
  keycloak:
    container_name: keycloak_app
    image: jboss/keycloak
    depends_on:
      - mariadb
    restart: always
    ports:
      - "8080:8080"
      - "8443:8443"
    volumes:
      - "/srv/docker/keycloak/data/certs/:/etc/x509/https"   # map certificates to container
    environment:
      KEYCLOAK_USER: <user>
      KEYCLOAK_PASSWORD: <pw>
      KEYCLOAK_HTTP_PORT: 8080
      KEYCLOAK_HTTPS_PORT: 8443
      KEYCLOAK_HOSTNAME: sub.example.ocm
      DB_VENDOR: mariadb
      DB_ADDR: localhost
      DB_USER: keycloak
      DB_PASSWORD: <pw>
    network_mode: host

  mariadb:
    container_name: keycloak_db
    image: mariadb
    volumes:
      - "/srv/docker/keycloak/data/keycloak_db:/var/lib/mysql"
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: <pw>
      MYSQL_DATABASE: keycloak
      MYSQL_USER: keycloak
      MYSQL_PASSWORD: <pw>
    network_mode: host

Окончательная настройка каталога

Вот как выглядит моя окончательная настройка файлов и папок.

$ cd /srv/docker/keycloak/
$ tree
.
├── config
│   └── docker-compose.yml
└── data
    ├── certs
    │   ├── tls.crt
    │   └── tls.key
    └── keycloak_db

Запустить контейнер

Наконец, я смог запустить свое программное обеспечение, используя docker-compose.

$ cd /srv/docker/keycloak/config/
$ sudo docker-compose up -d

Мы видим смонтированные сертификаты внутри контейнера.

$ cd /srv/docker/keycloak/config/
$ sudo docker-compose up -d

Мы можем дважды проверить установленные сертификаты в контейнере.

## open internal shell of keycloack container
$ sudo docker exec -it keycloak_app /bin/bash

## open directory of certificates
$ cd /etc/x509/https/
$ ll
-rw----r-- 1 root root 3586 Oct 30 14:21 tls.crt
-rw----r-- 1 root root 1708 Oct 30 14:20 tls.key

Учитывая настройку из docker-compose.yml, keycloak теперь доступен по адресу https://sub.example.com:8443/

Для тех, кто пытается запустить Keycloak с файлом закрытого ключа, защищенным парольной фразой:

Keycloak запускает скрипт /opt/jboss/tools/x509.sh для создания хранилища ключей на основе предоставленных файлов в /etc/x509/httpsкак описано в https://hub.docker.com/r/jboss/keycloak - Настройка TLS(SSL).

К сожалению, этот сценарий не принимает во внимание кодовую фразу. Но с небольшими изменениями во время сборки Docker вы можете исправить это самостоятельно: в вашем Dockerfile добавьте:

RUN sed -i -e 's/-out "${KEYSTORES_STORAGE}\/${PKCS12_KEYSTORE_FILE}" \\/-out "${KEYSTORES_STORAGE}\/${PKCS12_KEYSTORE_FILE}" \\\n      -passin pass:"${SERVER_KEYSTORE_PASSWORD}" \\/' /opt/jboss/tools/x509.sh

Эта команда изменяет сценарий и добавляет параметр для передачи парольной фразы.-passin pass:"${SERVER_KEYSTORE_PASSWORD}"

Значение параметра - это переменная среды, которую вы можете установить: SERVER_KEYSTORE_PASSWORD

Протестировано с Keycloak 9.0.0

Другие вопросы по тегам