Как добавить SSL в keycloak в докере

У меня проблема с добавлением SSL-сертификата в Keycloak, работающий в докере. Я получил SSL-сертификат от AWS EC2 с Load Balancer, но не знаю, как добавить его в Keycloak на докере. Я искал в гугле, но пока ничего не нашел.

Также, когда я перехожу на страницу типа: https://stackoverflow.com, SSL работает отлично. Но когда я пытаюсь открыть https://stackoverflow.com:8443 (поскольку 8443 - это порт Keycloak), он не работает.

Вот код Dockerfile из Keycloak:

FROM jboss/keycloak:4.6.0.Final

WORKDIR /opt/jboss/keycloak

COPY realm-export.json /opt/jboss/keycloak/

EXPOSE 8443

ENTRYPOINT [ "/opt/jboss/tools/docker-entrypoint.sh" ]
CMD ["-b", "0.0.0.0", "-bmanagement", "0.0.0.0", "-Dkeycloak.import=realm-export.json -Dkeycloak.migration.strategy=OVERWRITE_EXISTING"]

А вот файл docker-compose.yml:

version: '2'

services:
  keycloak:
    build: "./Keycloak + actibook-app client import"
    depends_on:
      - keycloak-postgres
    environment:
      - KEYCLOAK_USER=${KEYCLOAK_USER}
      - KEYCLOAK_PASSWORD=${KEYCLOAK_PASSWORD}
      - KEYCLOAK_IMPORT=${KEYCLOAK_IMPORT}
      - POSTGRES_USER=${KEYCLOAK_DATABASE_USER}
      - POSTGRES_PASSWORD=${KEYCLOAK_DATABASE_PASSW}
      - POSTGRES_PORT_5432_TCP_ADDR= keycloak-postgres
    ports:
      - "8443:8443"
    labels:
      - "traefik.frontend.passHostHeader=true"

  traefik:
    build: ./traefik
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    restart: unless-stopped

Почему вы порт 8443 публикуете? При использовании обратного прокси-сервера для http / https, такого как Traefik, единственным публичным опубликованным портом должен быть 80 и 443. "backend" -контейнеры должны быть доступны только в частной сети.

rckrd 25.12.2018 11:20

@rckrd хорошо, как я могу получить доступ к keycloak в этом порту другим способом?

TimeFrame 25.12.2018 16:16

@rckrd, когда вы хотите войти в систему, приложение должно перенаправить вас на страницу входа в Keycloak https://domain:8443/login, поэтому я не могу сделать это иначе, чем получить доступ к текущему порту

TimeFrame 25.12.2018 16:20

Я предлагаю прочитать о назначении обратного прокси en.m.wikipedia.org/wiki/Reverse_proxy

rckrd 25.12.2018 16:31

@rckrd да, я сделал это. Но проблема в том, что я не знаю, как еще я могу получить доступ к этой службе keycloak.

TimeFrame 25.12.2018 16:36

Я бы настроил traefik для обслуживания Keycloak на субдомене, таком как account.example.com. Т.е. запросы на account.example.com перенаправляются в частной сети в контейнер, в котором запущен keycloak.

rckrd 25.12.2018 16:40

@rckrd, так что это единственный вариант, верно? Думаю, чтобы это произошло, мне следует добавить traefik.frontend.rule=Host:account.example.com на ярлыке службы keycloak в docker-compose.yml? А тогда у домена нужно его указать перенаправить на публичный ip сервера?

TimeFrame 25.12.2018 16:59

Да, звучит как хорошее решение

rckrd 25.12.2018 17:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
8
11 487
5

Ответы 5

README - хороший друг - https://hub.docker.com/r/jboss/keycloak/:

Setting up TLS(SSL)

Keycloak image allows you to specify both a private key and a certificate for serving HTTPS. In that case you need to provide two files:

tls.crt - a certificate
tls.key - a private key

Those files need to be mounted in /etc/x509/https directory. The image will automatically convert them into a Java keystore and reconfigure Wildfly to use it.

Но это только конфигурация контейнера Keycloak TLS. Вы также используете Traefik, поэтому вам может потребоваться настроить TLS в контейнере Traefik - это зависит от вашей конфигурации.

Нужно ли мне предоставлять их как тома в docker-compose.yml, а затем вызывать tls.crt и tls.key каждый для файла, содержащего сертификат и закрытый ключ, или я должен называть их флагами здесь, в DockerFile CMD ["-b", "0.0.0.0", "-bmanagement", "0.0.0.0", "-Dkeycloak.import=realm-export.json -Dkeycloak.migration.strategy=OVERWRITE_EXISTING"]

TimeFrame 25.12.2018 09:51

Аскер написал, что используется балансировщик нагрузки. Почему сертификаты должны быть настроены на keycloak? SSL должен быть завершен в балансировщике нагрузки, верно?

rckrd 25.12.2018 11:14

@rckrd ну проблема в том, что когда я пытаюсь открыть https://stackoverflow.com:8443, порт 8443 которого является портом Keycloak, SSL не работает. Я предполагаю, что Keycloak по умолчанию генерирует самозаверяющий сертификат

TimeFrame 25.12.2018 11:26

@rckrd Keycloak - это компонент безопасности / аутентификации - всегда полезно использовать TLS для связи также за LB. Непонятно, какова здесь роль Траэфика. Это роутер или LB +, где терминируется TLS соединение, ....?

Jan Garaj 25.12.2018 15:24

@JanGaraj человек хотел, чтобы traefik был реализован как обратный прокси

TimeFrame 25.12.2018 16:17

Для меня сделка заключалась в сопоставлении порта 8443 и изменении прав доступа к файлу на 655 перед запуском стека. Я действительно считаю, что в dockerhub отсутствует документация по режиму SSL.

Balbinator 17.07.2020 22:45

Я под комментарием респ. уровень, поэтому я добавляю здесь ответ. Я предполагаю, что все ваши компоненты являются контейнерами докеров.

Ответ @Jan Garaj в принципе правильный. Что непонятно, так это то, что логическая маршрутизация в вашем случае выглядит так (сервисная сторона):

service --> Keyclaok --> traefik --> network/dns --> user/browser

Фактическая маршрутизация выглядит следующим образом (т.е. предполагается сеть докеров с обычным мостом):

service
   |---------> traefik --> network/dns --> user/browser
keyclaok
  • Keycloak создает самоподписанный сертификат между собой и Traefik.
    • вы должны указать директиву volumes: в файле docker-compose.yml Keyclaok (как упоминалось ранее).
  • Если вы просто хотите проверить, работает ли Keycloak, вы можете добавить InsecureSkipVerify = true в начало файла конфигурации Traefik (например, traefik.toml).
  • После того, как вы установили, что Keycloak доступен, вы должны либо использовать пару сертификатов AWS, либо создать свой собственный самозаверяющий сертификат (с личным центром сертификации).

Просто вставьте docker-compose.yml в служебный пользователь keycloak: root

Образ keycloak устанавливается как root, но выполнение контейнера выполняется как jboss, но разрешения каталога не позволяют jboss создавать jks для выполнения https.

Если вы запустите контейнер как root, он работает.

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

Вам нужно будет убедиться, что ключевой файл доступен для чтения пользователем jboss внутри докера. Вот несколько ключевых шагов в моем решении: 1. получить сертификат / ключ от Let's encrypt. 2. изменить режим файла на 655 3. прикрепите их к keycloak: - /opt/www/sso/cert/fullchain.pem:/etc/x509/https/tls.crt - /opt/www/sso/cert/privkey.pem:/etc/x509/https/tls.key 4. запустить образ докера 5. Измените режим файла обратно на 600 для ключевого файла.

Спасибо за подсказку о разрешении файла. Если кому-то это нужно, ниже приведены команды, которые я использовал для запуска докера keycloak: chmod 655 /home/test/keycloak.* и docker run -d --name keycloak --net keycloak-network -p 8443:8443 -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin --mount type=bind,source=/home/test/keycloak.key,target=/etc/x509/ht‌​tps/tls.key --mount type=bind,source=/home/test/keycloak.crt,target=/etc/x509/ht‌​tps/tls.crt jboss/keycloak

maximus 21.09.2021 11:26

Шаги, указанные в документация докеров, абсолютно правильны. И то же самое было процитировано другими в приведенных выше ответах. Я просто хочу указать на сценарий, который используется для чтения смонтированных сертификатов и ключей, а затем на лету создаются хранилища ключей.

Можно ссылаться на сценарий по пути /opt/jboss/tools/x509.sh внутри контейнера или ссылаться на него из github. Это помогло мне при отладке того же самого.

Необходимо обязательно убедиться, что они загружают ключ и сертификат по точному пути и в папку с соответствующими разрешениями. Кроме того, имя ключа должно быть tls.key, а сертификат должен быть tls.crt, поскольку они жестко прописаны в сценарии.

Бонус: тот же сценарий используется для добавления файлов CA в хранилище доверенных сертификатов, которое также создается на лету. Следовательно, если ваш keycloak взаимодействует с другими серверами https, не забудьте смонтировать корневые файлы CA в контейнер keycloak и передать переменную среды, как показано ниже.

X509_CA_BUNDLE=/path/to/root1.pem /path/to/root2.pem

Также убедитесь, что файлы ca имеют формат PEM и соответствующие разрешения.

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