Traefik反向代理Keycloak出现SSL required认证错误及安全性疑问
问题结论
你当前采用的keycloak.ssl-required = none的临时修复方案存在极高安全风险,禁止在生产环境使用。
问题根因解释
你遇到的告警本质是Keycloak的SSL校验机制触发:
SSL is required to authenticate. Remote address IP is secure: false, SSL required for: EXTERNAL .
Keycloak部署在Traefik反向代理后,Traefik对外提供HTTPS访问,但Traefik和Keycloak/后端Spring应用的内部通信走HTTP协议,默认配置下Keycloak适配器无法识别原始请求是HTTPS,误判为外部HTTP请求访问,所以触发拦截返回401。
你之前尝试移除X-Forwarded-*相关请求头的操作是完全反向的错误操作,这类头正是用来让后端服务识别原始请求协议、IP的核心参数。
为什么ssl-required = none不安全
该配置会完全关闭Keycloak的SSL校验要求,允许所有HTTP请求完成认证流程,攻击者可以通过HTTP协议嗅探到用户的账号密码、登录令牌等敏感凭证,直接导致用户身份被窃取,业务完全暴露在数据泄露风险中。
标准安全修复方案
- 替换Traefik的请求头配置,从移除头改为正确传递原始请求信息:
- traefik.http.middlewares.sso.headers.customrequestheaders.X-Forwarded-Proto=https - traefik.http.middlewares.sso.headers.customrequestheaders.X-Forwarded-Host=<你的Keycloak对外域名> - traefik.http.middlewares.sso.headers.customrequestheaders.X-Forwarded-For=%[remote_addr]
- 给你的Spring应用添加配置,让Keycloak适配器信任代理转发的头信息:
server.forward-headers-strategy: native
- 开启Keycloak服务端的代理地址转发信任配置,Keycloak启动时添加环境变量:
PROXY_ADDRESS_FORWARDING=true - 把
keycloak.ssl-required配置恢复为默认值external,同时将Keycloak管理后台对应Realm的SSL Required参数改回External requests,保证所有公网请求强制走HTTPS,内部代理通信不做额外限制。
内容的提问来源于stack exchange,提问作者jakob
相关产品推荐
相关产品推荐

