Keycloak容器自动替换Certbot生成的证书,出现Cisco Umbrella证书导致连接不安全
Keycloak容器自动替换Certbot生成的证书,出现Cisco Umbrella证书导致连接不安全
看起来你遇到的问题大概率是网络层面的流量拦截加上Keycloak与Nginx的HTTPS配置冗余导致的,咱们一步步拆解解决:
先搞懂问题根源
Cisco Umbrella是企业级的安全网关,它会自动拦截HTTPS流量并替换证书(做中间人审计)。你提到证书会突然变成Umbrella的,说明有流量没有通过Nginx反向代理,而是直接访问了Keycloak容器的8443端口,被Umbrella拦截替换了证书。另外,你同时在Keycloak和Nginx上配置了HTTPS,这种冗余配置也容易出现不可控的问题。
解决方案:让Nginx全权处理SSL,Keycloak内部用HTTP
这是反向代理场景下的标准配置,既能避免证书冲突,也能彻底杜绝直接访问Keycloak端口的风险:
1. 修改Docker Compose的Keycloak配置
把Keycloak改成HTTP模式,同时开启反向代理适配:
version: "3.9" services: keycloak: container_name: "keycloak" image: quay.io/keycloak/keycloak:22.0.3 environment: KC_DB: mysql KC_DB_URL: jdbc:mysql://database_container:3306/keycloak KC_DB_USERNAME: username KC_DB_PASSWORD: password KEYCLOAK_ADMIN: kc_admin KEYCLOAK_ADMIN_PASSWORD: kc_admin_password KC_HOSTNAME: keycloak.hostname.com KC_PROXY: edge # 告诉Keycloak它运行在反向代理之后 KC_HTTP_PORT: 8080 # 启用HTTP端口 ports: - "8080:8080" # 只映射HTTP端口,移除8443 # 移除证书挂载,因为Keycloak不再需要处理HTTPS command: start --proxy=edge --hostname-strict=true networks: - my_network networks: my_network: name: my_network external: true
2. 调整Nginx配置
把反向代理的目标改成Keycloak的HTTP端口,同时添加必要的转发头,让Keycloak知道请求是通过HTTPS进来的:
server { server_name www.keycloak.hostname.com keycloak.hostname.com; location / { proxy_pass http://ip_address:8080/; # 改成HTTP协议 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_buffer_size 256k; proxy_buffers 4 512k; proxy_busy_buffers_size 512k; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 关键:告诉Keycloak请求是HTTPS的 } listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/keycloak.hostname.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/keycloak.hostname.com/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } server { if ($host = www.keycloak.hostname.com) { return 301 https://$host$request_uri; } # managed by Certbot if ($host = keycloak.hostname.com) { return 301 https://$host$request_uri; } # managed by Certbot server_name www.keycloak.hostname.com keycloak.hostname.com; listen 80; return 404; # managed by Certbot }
3. 加固网络访问规则
为了彻底防止流量绕过Nginx,建议在防火墙/安全组里设置:
- 只允许Nginx所在的主机访问Keycloak的8080端口
- 禁止外部直接访问Keycloak的任何端口
额外排查点
如果调整后还是出现问题,你可以:
- 查看Keycloak容器的日志,确认有没有证书加载失败的报错(不过你的情况更可能是网络问题)
- 联系公司的网络管理员,确认Cisco Umbrella是否把你的Keycloak域名加入了白名单,避免被拦截替换证书
备注:内容来源于stack exchange,提问作者Alessio Raddi
相关产品推荐
相关产品推荐

