我的情况是,在终止安全(https)连接的反向代理之后运行Keycloak 18.0.0。因此,我想构建一个Docker映像,它将Keycloak配置为只在http上侦听(例如端口8080)。
我已经从Dockerfile中调整了Keycloak文件。它用
--proxy=edge选项(参见代理模式)。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"]然后,我使用
docker build --no-cache . -t ghcr.io/saw303/zscsupporter-be/keycloak-18.0.0:0.0.1并在我的码头组合中启动图像。
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"然后,当我开始使用
docker compose up -d && docker compose logs -f keycloak我得到以下日志语句,它清楚地声明它使用严格的HTTPS。
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当我访问管理控制台时
http://localhost:9001/admin/master/console/我得到一个空白页,管理控制台只发送一个请求给
http://localhost:9001/admin/master/console/config返回错误的URL https:。
{
"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容器。
{
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容器时,我看到下面的活动配置
➜ 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是禁用的。
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])发布于 2022-05-30 14:43:09
通过将反向代理配置为使用自签名证书,我成功地在localhost上启动并运行了它。
{
admin off
}
localhost:443 {
reverse_proxy keycloak:8080
tls internal
}
log卡迪的神奇之处在于声明了tls internal。
在那之后,我把我的Dockerfile改成了这个
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。
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管理控制台的访问终于可以工作了。似乎不可能使用非安全连接访问管理控制台。
发布于 2022-05-30 08:08:58
看起来您的Keycloak实例不使用--proxy=edge配置。
尝试官方文档语法:--proxy edge (当然是转换为Dockerfile语法)或更简单的选项是设置Keycloak容器env变量KC_PROXY: edge
https://stackoverflow.com/questions/72426072
复制相似问题