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
相关产品推荐
相关产品推荐

