You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx反向代理下Keycloak 21.1 HTTPS跳转问题排查

问题描述

我正在学习使用Keycloak,希望禁用其HTTPS功能(无需考虑安全问题)。我的Docker配置如下:

keycloak:
image: quay.io/keycloak/keycloak:21.1
container_name: keycloak
restart: always
environment:
  KC_DB_URL: jdbc:postgresql://postgres:5432/keycloak
  KC_DB_USERNAME: postgres
  KC_DB_PASSWORD: foo
  KC_HTTP_RELATIVE_PATH: /auth/
  KC_PROXY: "passthrough"
  KC_HOSTNAME_STRICT: "false"
  KC_HOSTNAME_STRICT_HTTPS: "false"
  KC_HOSTNAME: "myurl.onion:4672/auth"
  KEYCLOAK_ADMIN: "admin"
  KEYCLOAK_ADMIN_PASSWORD: "bar"
entrypoint: ["/opt/keycloak/bin/kc.sh", "start-dev", "--db=postgres"]
ports:
  - 8080:8080
volumes:
  - /config/keycloak/themes/:/opt/keycloak/themes/
  - /config/keycloak/deployments:/opt/keycloak/providers
depends_on:
  - postgres
networks:
  - nt_int

Nginx代理配置如下:

listen 4672 default_server;
    listen [::]:4672 default_server;

    root /site;

    server_name _;
    server_tokens off;

    location /auth/ {
            proxy_pass                           http://keycloak:8080/auth/;
            proxy_set_header   X-Forwarded-Proto $scheme;
            proxy_set_header   Host              $host:$server_port;
            proxy_set_header   X-Real-IP         $remote_addr;
            proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Port  $server_port;
    }

可以正常访问Keycloak主页,但点击登录主领域时出现以下错误:

Mixed Content: The page at 'http://myurl.onion:4672/auth/admin/master/console/' was loaded over HTTPS, but requested an insecure frame 'http://myurl.onion:4672/auth/auth/realms/master/protocol/openid-connect/3p-cookies/step1.html'. This request has been blocked; the content must be served over HTTPS.

尝试过将KC_PROXY改为edge、手动禁用领域SSL、设置PROXY_ADDRESS_FORWARDING为true、切换到17.0.1版本,问题依旧。请问哪里配置错误?

问题分析与解决方案

核心问题

错误中出现重复的/auth/auth/路径,且Keycloak生成的URL协议为HTTP,与外部访问的HTTPS不匹配,导致混合内容拦截。这是由KC_HOSTNAME配置错误和代理协议头传递问题共同导致的。

具体修改步骤

  1. 修正Keycloak环境变量
    • 移除KC_HOSTNAME末尾的/auth,避免路径重复:KC_HOSTNAME: "myurl.onion:4672"
    • 将KC_PROXY设为edge,让Keycloak信任代理传递的协议和端口信息
    • 保留KC_HOSTNAME_STRICT: "false"和KC_HOSTNAME_STRICT_HTTPS: "false"以禁用HTTPS强制检查

修改后的Docker环境变量片段:

environment:
  KC_DB_URL: jdbc:postgresql://postgres:5432/keycloak
  KC_DB_USERNAME: postgres
  KC_DB_PASSWORD: foo
  KC_HTTP_RELATIVE_PATH: /auth/
  KC_PROXY: "edge"
  KC_HOSTNAME_STRICT: "false"
  KC_HOSTNAME_STRICT_HTTPS: "false"
  KC_HOSTNAME: "myurl.onion:4672"
  KEYCLOAK_ADMIN: "admin"
  KEYCLOAK_ADMIN_PASSWORD: "bar"
  1. 调整Nginx代理配置
    • 将X-Forwarded-Proto硬设为https,确保Keycloak识别外部请求使用的是HTTPS协议,避免生成HTTP链接
    • 其他代理头保持不变,确保主机和端口信息正确传递

修改后的Nginx location片段:

location /auth/ {
        proxy_pass                           http://keycloak:8080/auth/;
        proxy_set_header   X-Forwarded-Proto https;
        proxy_set_header   Host              $host:$server_port;
        proxy_set_header   X-Real-IP         $remote_addr;
        proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Port  $server_port;
}
  1. 重启服务
    修改配置后,重启Keycloak和Nginx容器,验证登录流程是否正常。

内容的提问来源于stack exchange,提问作者Jacopo Sciampi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 17:14:55