我有一个这样的情况,我运行 Keycloak 18.0.0 在一个反向代理后面,反向代理终止了安全(https)连接。因此,我想构建一个 Docker 镜像,将 Keycloak 配置为仅监听 http(例如端口8080)。
我已经调整了Keycloak文档中的Dockerfile配置。它使用:
我随后使用以下命令构建我的Docker镜像:
并在我的Docker组合中启动图像。
当我使用以下命令启动Docker组合时:
我收到了以下日志记录语句,明确表示它使用了严格的HTTPS。
当我访问管理控制台时
我得到了一个空白页面,管理控制台只发送了一个请求。
这句话的意思是:返回错误的URL地址,其中包含了“https:”这个部分。
有没有办法将字段值
更新1:代理配置
我使用Caddy Server 2.0作为反向代理。在这个测试设置中,Caddy是Docker组合的一部分,并简单地将端口
请注意,无论我是通过反向代理
更新2:在docker-compose.yml中设置KC_PROXY
现在在
有趣的是,它表明HTTP被禁用了。
我已经调整了Keycloak文档中的Dockerfile配置。它使用:
- MariaDB作为数据库
- 启用健康和指标终端点
- 由于我在反向代理中终止了TLS连接,所以在启动 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镜像:
docker build --no-cache . -t ghcr.io/saw303/zscsupporter-be/keycloak-18.0.0:0.0.1
并在我的Docker组合中启动图像。
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组合时:
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:代理配置
我使用Caddy Server 2.0作为反向代理。在这个测试设置中,Caddy是Docker组合的一部分,并简单地将端口
80
上的所有请求重定向到端口8080
上的keycloak
容器。{
admin off
}
localhost:80
reverse_proxy /* keycloak:8080
log
请注意,无论我是通过反向代理
localhost:80
还是直接访问 localhost:9001
,行为都是相同的。当通过代理访问时,我当然会更改端口值 KC_HOSTNAME_PORT: 80
。更新2:在docker-compose.yml中设置KC_PROXY
现在在
docker-compose.yml
中设置了KC_PROXY
环境变量,但行为仍然相同。当我进入运行中的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])