AWS CloudFront反向代理KeyCloak路径配置问题求助
现状
ECS上容器运行正常,但访问https://<url>.de/auth/admin/master/console/时返回403错误,核心原因是资源请求路径异常:
GET https://url.de/resources/ly799/admin/keycloak.v2/assets/main-CvkXqs02.css net::ERR_ABORTED 403 (Forbidden)
当前CloudFront仅配置了/auth/**的行为,直接请求/resources/**会触发403;添加/resources/**行为后又返回404,说明KeyCloak未将资源路径映射到/auth/resources前缀下。
核心需求
- 用户通过
<url>/auth/**访问KeyCloak全部功能 - KeyCloak运行在
/auth/前缀路径下 - 仅允许CloudFront的HTTPS访问,直接HTTP访问EC2 IP报错(已实现)
已配置内容
1. CloudFront
- 源指向EC2实例的8081端口
- 行为
auth/**:HTTP重定向到HTTPS,允许所有HTTP方法,缓存策略为CachingOptimized,源请求策略为AllViewerExceptHostHeader
2. 初始KeyCloak Docker配置
FROM quay.io/keycloak/keycloak:26.0.0 AS builder RUN /opt/keycloak/bin/kc.sh build \ --features=admin,preview,hostname:v2 \ --spi-hostname-default-hostname=https://<url>.de \ --spi-hostname-default-admin=https://<url>.de/auth \ --spi-hostname-default-path=/auth \ --spi-hostname-default-strict=true \ --spi-hostname-default-strict-https=false \ --spi-hostname-default-forwarded=true \ --http-relative-path=/auth \ --db=postgres FROM quay.io/keycloak/keycloak:26.0.0 COPY --from=builder /opt/keycloak/ /opt/keycloak/ EXPOSE 8081 # Runtime ENV KC_DB_URL=jdbc:postgresql://localhost:5432/keycloak_db ENV KC_BOOTSTRAP_ADMIN_USERNAME=admin ENV KC_BOOTSTRAP_ADMIN_PASSWORD=test ENV KC_PROXY_HEADERS=xforwarded ENV KC_HTTP_RELATIVE_PATH=/auth ENV KC_HOSTNAME=https://<url>.de ENV KC_HTTP_ENABLED=true ENV KC_HTTP_PORT=8081 ENTRYPOINT ["/opt/keycloak/bin/kc.sh"] CMD ["start", "--optimized", "--proxy-headers=xforwarded", "--hostname-debug=true"]
本地测试(去掉KC_PROXY_HEADERS,KC_HOSTNAME设为localhost)时,KeyCloak能正确处理/auth/和/auth/resources路径请求。
3. 更新后的配置
调整Dockerfile并在CloudFront添加/resources/**、/admin/**行为后:
FROM quay.io/keycloak/keycloak:26.0.0 RUN /opt/keycloak/bin/kc.sh build --db=postgres --features=hostname:v2 --http-relative-path=/auth ENV KC_DB_URL=jdbc:postgresql://localhost:5432/keycloak_db ENV KC_BOOTSTRAP_ADMIN_USERNAME=admin ENV KC_BOOTSTRAP_ADMIN_PASSWORD=123 ENV KC_HOSTNAME=https://xxx.xxx.net ENV KC_HOSTNAME_ADMIN=https://xxx.xxx.net ENV KC_HOSTNAME_BACKCHANNEL_DYNAMIC=true ENV KC_HTTP_ENABLED=true ENV KC_HTTP_PORT=8081 ENV KC_PROXY_HEADERS=xforwarded ENV KC_HOSTNAME_STRICT=true EXPOSE 8081 ENTRYPOINT ["/opt/keycloak/bin/kc.sh"] CMD ["start", "--optimized", "--hostname-debug=true"]
主控制台和/auth/**下的领域可正常访问,但资源请求仍失败,问题集中在KeyCloak路径配置。
解决方案
1. 修正KeyCloak核心配置
问题根源是KeyCloak生成的资源URL未携带/auth前缀,结合CloudFront代理场景,调整环境变量:
# 管理控制台完整路径需包含/auth前缀 ENV KC_HOSTNAME_ADMIN=https://xxx.xxx.net/auth # 强制所有资源路径带上/auth前缀 ENV KC_HTTP_RELATIVE_PATH=/auth # 使用edge代理模式,适配CloudFront这类反向代理场景 ENV KC_PROXY=edge
KC_PROXY=edge会让KeyCloak完全依赖代理传递的头部生成正确URL,比xforwarded更适配CloudFront。
2. 简化CloudFront行为
无需额外配置/resources/**或/admin/**,仅保留/auth/**行为即可——所有资源请求会被KeyCloak映射到/auth/resources路径下,CloudFront只需将/auth/**请求转发到EC2 8081端口。同时确保源请求策略保留X-Forwarded-Path等头部,让KeyCloak识别完整请求路径。
3. 统一构建与运行配置
构建时同步指定代理模式,避免配置冲突:
RUN /opt/keycloak/bin/kc.sh build \ --db=postgres \ --features=hostname:v2 \ --http-relative-path=/auth \ --proxy=edge
内容的提问来源于stack exchange,提问作者TheGameZ

