У меня проблема с добавлением 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
@rckrd хорошо, как я могу получить доступ к keycloak в этом порту другим способом?
@rckrd, когда вы хотите войти в систему, приложение должно перенаправить вас на страницу входа в Keycloak https://domain:8443/login, поэтому я не могу сделать это иначе, чем получить доступ к текущему порту
Я предлагаю прочитать о назначении обратного прокси en.m.wikipedia.org/wiki/Reverse_proxy
@rckrd да, я сделал это. Но проблема в том, что я не знаю, как еще я могу получить доступ к этой службе keycloak.
Я бы настроил traefik для обслуживания Keycloak на субдомене, таком как account.example.com. Т.е. запросы на account.example.com перенаправляются в частной сети в контейнер, в котором запущен keycloak.
@rckrd, так что это единственный вариант, верно? Думаю, чтобы это произошло, мне следует добавить traefik.frontend.rule=Host:account.example.com на ярлыке службы keycloak в docker-compose.yml? А тогда у домена нужно его указать перенаправить на публичный ip сервера?
Да, звучит как хорошее решение





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 keyThose 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"]
Аскер написал, что используется балансировщик нагрузки. Почему сертификаты должны быть настроены на keycloak? SSL должен быть завершен в балансировщике нагрузки, верно?
@rckrd ну проблема в том, что когда я пытаюсь открыть https://stackoverflow.com:8443, порт 8443 которого является портом Keycloak, SSL не работает. Я предполагаю, что Keycloak по умолчанию генерирует самозаверяющий сертификат
@rckrd Keycloak - это компонент безопасности / аутентификации - всегда полезно использовать TLS для связи также за LB. Непонятно, какова здесь роль Траэфика. Это роутер или LB +, где терминируется TLS соединение, ....?
@JanGaraj человек хотел, чтобы traefik был реализован как обратный прокси
Для меня сделка заключалась в сопоставлении порта 8443 и изменении прав доступа к файлу на 655 перед запуском стека. Я действительно считаю, что в dockerhub отсутствует документация по режиму SSL.
Я под комментарием респ. уровень, поэтому я добавляю здесь ответ. Я предполагаю, что все ваши компоненты являются контейнерами докеров.
Ответ @Jan Garaj в принципе правильный. Что непонятно, так это то, что логическая маршрутизация в вашем случае выглядит так (сервисная сторона):
service --> Keyclaok --> traefik --> network/dns --> user/browser
Фактическая маршрутизация выглядит следующим образом (т.е. предполагается сеть докеров с обычным мостом):
service
|---------> traefik --> network/dns --> user/browser
keyclaok
volumes: в файле docker-compose.yml Keyclaok (как упоминалось ранее).InsecureSkipVerify = true в начало файла конфигурации Traefik (например, traefik.toml).Просто вставьте 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/https/tls.key --mount type=bind,source=/home/test/keycloak.crt,target=/etc/x509/https/tls.crt jboss/keycloak
Шаги, указанные в документация докеров, абсолютно правильны. И то же самое было процитировано другими в приведенных выше ответах. Я просто хочу указать на сценарий, который используется для чтения смонтированных сертификатов и ключей, а затем на лету создаются хранилища ключей.
Можно ссылаться на сценарий по пути /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 и соответствующие разрешения.
Почему вы порт 8443 публикуете? При использовании обратного прокси-сервера для http / https, такого как Traefik, единственным публичным опубликованным портом должен быть 80 и 443. "backend" -контейнеры должны быть доступны только в частной сети.