如何不使用AJP配置Apache反向代理后的Tomcat并解决认证透传问题
移除AJP后Kerberos认证透传至Tomcat的解决方案
AJP协议默认会直接将Apache侧的认证上下文传递给Tomcat,切换为mod_proxy_http后需要手动配置请求头传递、Tomcat参数适配才能恢复Kerberos认证透传能力,具体操作步骤如下:
1. Apache侧配置调整
- 首先确认基础配置生效:已加载
mod_auth_gssapi/mod_auth_kerb、mod_proxy、mod_proxy_http、mod_headers模块,Apache本地Kerberos认证正常,访问Apache资源时可正常获取到REMOTE_USER(可在Apache日志中打印该变量验证)。 - 在对应的
VirtualHost配置块中补充以下配置:
# 保留原始请求的Host头,避免Tomcat重定向地址错误 ProxyPreserveHost On # 透传Kerberos认证的用户名到Tomcat RequestHeader set X-Forwarded-User "%{REMOTE_USER}s" # 透传原始请求协议,适配HTTPS场景 RequestHeader set X-Forwarded-Proto "https" # 原有Proxy配置保持不变 ProxyPass / http://<Tomcat内网地址>:<端口>/ ProxyPassReverse / http://<Tomcat内网地址>:<端口>/ # 如需要开启Kerberos票据委托,额外添加以下配置(可选) GssapiDelegateCredentials On
2. Tomcat侧配置调整
- 编辑
conf/server.xml,添加RemoteIpValve阀门,信任Apache代理地址并读取传递的认证用户头:
<Valve className="org.apache.catalina.valves.RemoteIpValve" internalProxies="<Apache服务器的内网IP,多个IP用|分隔>" remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto" remoteUserHeader="X-Forwarded-User" />
- 如你的应用有特殊权限校验逻辑依赖
javax.servlet.security.UserPrincipal,上述配置即可让request.getRemoteUser()、request.getUserPrincipal()正常返回Kerberos认证信息,无需修改业务代码。
3. 异常排查
- 如认证信息仍未透传,执行
apache2ctl -M(Debian/Ubuntu)或httpd -M(CentOS/RHEL)确认headers_module已正常加载 - 检查Apache配置中没有对
X-Forwarded-User头做过滤、重写操作 - 如使用HTTP协议而非HTTPS,确认Kerberos策略允许在HTTP场景下传递认证信息
内容的提问来源于stack exchange,提问作者MikeB
相关产品推荐
相关产品推荐

