首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何配置仅在生产模式下运行http的Keycloak 18?

如何配置仅在生产模式下运行http的Keycloak 18?
EN

Stack Overflow用户
提问于 2022-05-29 18:01:33
回答 2查看 5.2K关注 0票数 2

我的情况是,在终止安全(https)连接的反向代理之后运行Keycloak 18.0.0。因此,我想构建一个Docker映像,它将Keycloak配置为只在http上侦听(例如端口8080)。

我已经从Dockerfile中调整了Keycloak文件。它用

  • MariaDB作为数据库
  • 启用端点
  • 由于我在反向代理中终止TLS连接,所以在启动Keycloak时,我还使用了--proxy=edge选项(参见代理模式)。
代码语言:javascript
复制
FROM quay.io/keycloak/keycloak:18.0.0 as builder

ENV KC_HEALTH_ENABLED=true
ENV KC_METRICS_ENABLED=true
ENV KC_DB=mariadb
# Install custom providers
RUN curl -sL https://github.com/aerogear/keycloak-metrics-spi/releases/download/2.5.3/keycloak-metrics-spi-2.5.3.jar -o /opt/keycloak/providers/keycloak-metrics-spi-2.5.3.jar
RUN /opt/keycloak/bin/kc.sh build

FROM quay.io/keycloak/keycloak:18.0.0
COPY --from=builder /opt/keycloak/ /opt/keycloak/
WORKDIR /opt/keycloak
ENTRYPOINT ["/opt/keycloak/bin/kc.sh", "start"]

然后,我使用

代码语言:javascript
复制
docker build --no-cache . -t ghcr.io/saw303/zscsupporter-be/keycloak-18.0.0:0.0.1

并在我的码头组合中启动图像。

代码语言:javascript
复制
version: "3.9"
services:
  proxy:
    image: caddy:2.5.1-alpine
    ports:
      - "${PROXY_IP}:80:80"
      - "${PROXY_IP}:443:443"
    volumes:
      - ${BASE_PATH:-.}/docker-volume/caddy/Caddyfile:/etc/caddy/Caddyfile:Z
      - ${BASE_PATH:-.}/docker-volume/caddy/caddy_data:/data:Z
      - ${BASE_PATH:-.}/docker-volume/caddy/caddy_config:/config:Z
  
  keycloak:
    image: ghcr.io/saw303/zscsupporter-be/keycloak-18.0.0:0.0.1
    ports:
      - "127.0.0.1:9001:8080"
      - "127.0.0.1:9443:8443"
    environment:
      KC_HOSTNAME: localhost
      KC_HOSTNAME_PORT: 80
      KC_HOSTNAME_STRICT_BACKCHANNEL: true
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: admin
      KC_DB_URL: jdbc:mariadb://keycloakdb:3306/keycloak
      KC_DB_USERNAME: keycloak
      KC_DB_PASSWORD: secret
      KC_LOG_LEVEL: info
      KC_PROXY: edge

  keycloakdb:
    image: mariadb:10.7.3-focal
    environment:
      MYSQL_ROOT_PASSWORD: root_secret
      MYSQL_DATABASE: keycloak
      MYSQL_USER: keycloak
      MYSQL_PASSWORD: secret
      TZ: "Europe/Zurich"
    tmpfs:
      - /var/lib/mysql:rw
    ports:
      - "127.0.0.1:3307:3306"

然后,当我开始使用

代码语言:javascript
复制
docker compose up -d && docker compose logs -f keycloak

我得到以下日志语句,它清楚地声明它使用严格的HTTPS

代码语言:javascript
复制
backend-keycloak-1  | 2022-05-29 17:37:46,922 INFO  [org.keycloak.quarkus.runtime.hostname.DefaultHostnameProvider] (main) Hostname settings: FrontEnd: localhost, Strict HTTPS: true, Path: <request>, Strict BackChannel: false, Admin: localhost, Port: 8,080, Proxied: true

当我访问管理控制台时

代码语言:javascript
复制
http://localhost:9001/admin/master/console/

我得到一个空白页,管理控制台只发送一个请求给

代码语言:javascript
复制
http://localhost:9001/admin/master/console/config

返回错误的URL https:

代码语言:javascript
复制
{
  "realm": "master",
  "auth-server-url": "https://localhost:8080/",
  "ssl-required": "external",
  "resource": "security-admin-console",
  "public-client": true,
  "confidential-port": 0
}

是否有办法将字段值auth-server-url中的协议从https更改为http

更新1:代理配置

我使用CaddyServer2.0作为反向代理。在这个测试设置中,caddy是Docker组合的一部分,只需将端口80上的所有请求重定向到端口8080上的keycloak容器。

代码语言:javascript
复制
{
  admin off
}

localhost:80

reverse_proxy /* keycloak:8080

log

请注意,无论我是通过反向代理localhost:80还是直接通过localhost:9001访问密钥披风管理控制台,其行为都是相同的。当通过代理I访问它时,当然要更改端口值KC_HOSTNAME_PORT: 80

更新2:在docker中设置KC_PROXY -Compose.yml

KC_PROXY env变量现在被设置在docker-compose.yml中,但是行为是相同的。当我跳入正在运行的keycloak容器时,我看到下面的活动配置

代码语言:javascript
复制
➜  docker compose exec keycloak bash
WARN[0000] The "PROXY_IP" variable is not set. Defaulting to a blank string. 
WARN[0000] The "PROXY_IP" variable is not set. Defaulting to a blank string. 
bash-4.4$ bin/kc.sh show-config
Current Mode: none
Runtime Configuration:
        kc.cache =  ispn (PersistedConfigSource)
        kc.config.args =  show-config (SysPropConfigSource)
        kc.db =  mariadb (PersistedConfigSource)
        kc.db.password =  secret (EnvConfigSource)
        kc.db.url =  jdbc:mariadb://keycloakdb:3306/keycloak (EnvConfigSource)
        kc.db.username =  keycloak (EnvConfigSource)
        kc.health-enabled =  true (PersistedConfigSource)
        kc.home.dir =  /opt/keycloak/bin/../ (SysPropConfigSource)
        kc.hostname =  localhost (EnvConfigSource)
        kc.hostname.port =  80 (EnvConfigSource)
        kc.hostname.strict.backchannel =  true (EnvConfigSource)
        kc.http-enabled =  false (PropertiesConfigSource[source=jar:file:///opt/keycloak/lib/lib/main/org.keycloak.keycloak-quarkus-server-18.0.0.jar!/META-INF/keycloak.conf])
        kc.http-relative-path =  / (PersistedConfigSource)
        kc.log-console-output =  default (PropertiesConfigSource[source=jar:file:///opt/keycloak/lib/lib/main/org.keycloak.keycloak-quarkus-server-18.0.0.jar!/META-INF/keycloak.conf])
        kc.log-file =  /opt/keycloak/bin/../data/log/keycloak.log (PropertiesConfigSource[source=jar:file:///opt/keycloak/lib/lib/main/org.keycloak.keycloak-quarkus-server-18.0.0.jar!/META-INF/keycloak.conf])
        kc.log.level =  info (EnvConfigSource)
        kc.metrics-enabled =  true (PersistedConfigSource)
        kc.provider.file.keycloak-metrics-spi-2.5.3.jar.last-modified =  1653899384311 (PersistedConfigSource)
        kc.proxy =  edge (EnvConfigSource)
        kc.quarkus-properties-enabled =  false (PersistedConfigSource)
        kc.show.config =  none (SysPropConfigSource)
        kc.version =  18.0.0 (SysPropConfigSource)

有趣的是,它表明http是禁用的。

代码语言:javascript
复制
kc.http-enabled =  false (PropertiesConfigSource[source=jar:file:///opt/keycloak/lib/lib/main/org.keycloak.keycloak-quarkus-server-18.0.0.jar!/META-INF/keycloak.conf])
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-30 14:43:09

通过将反向代理配置为使用自签名证书,我成功地在localhost上启动并运行了它。

代码语言:javascript
复制
{
  admin off
}

localhost:443 {
        reverse_proxy keycloak:8080
        tls internal
}

log

卡迪的神奇之处在于声明了tls internal

在那之后,我把我的Dockerfile改成了这个

代码语言:javascript
复制
FROM quay.io/keycloak/keycloak:18.0.0 as builder

ENV KC_HEALTH_ENABLED=true
ENV KC_METRICS_ENABLED=true
ENV KC_FEATURES=token-exchange
ENV KC_DB=mariadb
RUN curl -sL https://github.com/aerogear/keycloak-metrics-spi/releases/download/2.5.3/keycloak-metrics-spi-2.5.3.jar -o /opt/keycloak/providers/keycloak-metrics-spi-2.5.3.jar
RUN /opt/keycloak/bin/kc.sh build

FROM quay.io/keycloak/keycloak:18.0.0
COPY --from=builder /opt/keycloak/ /opt/keycloak/
WORKDIR /opt/keycloak
ENTRYPOINT ["/opt/keycloak/bin/kc.sh", "start"]

以及相应的我的docker-compose.yml

代码语言:javascript
复制
version: "3.9"
services:
  proxy:
    image: caddy:2.5.1-alpine
    ports:
      - "${PROXY_IP}:80:80"
      - "${PROXY_IP}:443:443"
    volumes:
      - ${BASE_PATH:-.}/docker-volume/caddy/Caddyfile:/etc/caddy/Caddyfile:Z
      - ${BASE_PATH:-.}/docker-volume/caddy/caddy_data:/data:Z
      - ${BASE_PATH:-.}/docker-volume/caddy/caddy_config:/config:Z

  keycloak:
    image: ghcr.io/saw303/zscsupporter-be/keycloak-18.0.0:0.0.1
    ports:
      - "127.0.0.1:9443:8443"
    restart: unless-stopped
    environment:
      KC_DB_URL: jdbc:mariadb://keycloakdb:3306/keycloak
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: admin
      KC_HOSTNAME: localhost
      KC_HOSTNAME_STRICT: false
      KC_HTTP_ENABLED: true
      KC_DB_USERNAME: keycloak
      KC_DB_PASSWORD: secret
      KC_LOG_LEVEL: debug
      KC_PROXY: edge

  keycloakdb:
    image: mariadb:10.7.3-focal
    environment:
      MYSQL_ROOT_PASSWORD: root_secret
      MYSQL_DATABASE: keycloak
      MYSQL_USER: keycloak
      MYSQL_PASSWORD: secret
      TZ: "Europe/Zurich"
    tmpfs:
      - /var/lib/mysql:rw
    ports:
      - "127.0.0.1:3307:3306"
    deploy:
      resources:
        limits:
          cpus: "1.0"
          memory: 200M

在进行此配置之后,对Keycloak管理控制台的访问终于可以工作了。似乎不可能使用非安全连接访问管理控制台。

票数 2
EN

Stack Overflow用户

发布于 2022-05-30 08:08:58

看起来您的Keycloak实例不使用--proxy=edge配置。

尝试官方文档语法:--proxy edge (当然是转换为Dockerfile语法)或更简单的选项是设置Keycloak容器env变量KC_PROXY: edge

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72426072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档