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

Kubernetes部署Keycloak后访问Admin控制台遇CSP及HTTP/HTTPS问题

解决Keycloak K8s部署中的CSP与HTTPS加载问题

问题描述

  • 浏览器访问Admin控制台时出现CSP错误:

    Refused to frame 'http://keycloak.mydomain.com.br/' because it violates the following Content Security Policy directive: "frame-src 'self'".

  • DNS已配置SSL,但Keycloak仍以HTTP加载部分脚本,导致混合内容异常。

解决方案

1. 修正Keycloak代理与协议配置

  • 启用KC_PROXY_SCHEME=https,强制Keycloak生成HTTPS格式的外部链接,解决混合内容问题。
  • 用新版Keycloak标准变量KC_PROXY=edge替代旧的PROXY_ADDRESS_FORWARDING,适配Nginx终结SSL的代理场景。
  • 统一使用KC_前缀环境变量(新版Keycloak官方规范),替换旧版KEYCLOAK_前缀变量。

2. 调整CSP策略

  • 保留Ingress中的content-security-policy配置,确保frame-src包含HTTPS协议的域名,与Keycloak自身生成的CSP头形成互补。

3. 清理冗余配置

  • 移除重复的管理员账号配置(KEYCLOAK_USER/KEYCLOAK_PASSWORD已被KEYCLOAK_ADMIN/KEYCLOAK_ADMIN_PASSWORD覆盖)。
  • 修正容器端口映射逻辑,确保Service正确转发到Keycloak默认的8080 HTTP端口。

完整修正后的部署配置

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: portalbooking
  name: keycloak-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: keycloak
  template:
    metadata:
      labels:
        app: keycloak
    spec:
      containers:
        - name: keycloak
          image: quay.io/keycloak/keycloak:latest
          args: ["start-dev"]
          ports:
            - name: http
              containerPort: 8080
            - name: https
              containerPort: 8443
          readinessProbe:
            httpGet:
              path: /realms/master
              port: 8080
          env:
            - name: KEYCLOAK_ADMIN
              value: admin
            - name: KEYCLOAK_ADMIN_PASSWORD
              value: admin
            - name: KC_HOSTNAME
              value: keycloak.mydomain.com.br
            - name: KC_PROXY_SCHEME
              value: https
            - name: KC_PROXY_NAME
              value: keycloak.mydomain.com.br
            - name: KC_PROXY
              value: edge
            - name: DB_VENDOR
              value: h2
            - name: KC_HTTP_PORT
              value: "8080"
            - name: KC_HTTPS_PORT
              value: "8443"
            - name: KEYCLOAK_OPTS
              value: "-Dkeycloak.profile.feature.upload_scripts=enabled -Dkeycloak.profile=preview"
---
apiVersion: v1
kind: Service
metadata:
  namespace: portalbooking
  name: keycloak-service
spec:
  selector:
    app: keycloak
  ports:
    - name: http
      port: 80
      targetPort: 8080
    - name: https
      port: 443
      targetPort: 8443
  type: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: portalbooking
  name: keycloak-ingress
  annotations:
    kubernetes.io/ingress.class: 'nginx'
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/content-security-policy: "frame-src 'self' https://keycloak.mydomain.com.br"
spec:
  rules:
    - host: keycloak.mydomain.com.br
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: keycloak-service
                port:
                  number: 80

关键说明

  • KC_PROXY=edge:告知Keycloak运行在SSL终结代理之后,自动适配请求的协议与端口。
  • KC_PROXY_SCHEME=https:强制Keycloak生成的所有外部资源链接使用HTTPS协议。
  • Ingress的CSP配置明确指定HTTPS域名,避免HTTP源触发的框架加载限制。

内容的提问来源于stack exchange,提问作者Rafael Augusto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 22:57:22