我在登录Wildfly 13管理控制台
后收到身份验证要求
错误。
如果我输入的用户名或密码错误,它会再次要求输入,但如果我输入正确,它会显示带有错误消息的页面(因此我认为用户名和密码是正确的,但之后发生了其他错误)。
我正在使用 Docker 运行 Nginx 和 Wildfly 容器。Nginx 在外部监听端口 9991 并代理请求给 Wildfly 容器,但是在访问 Wildfly 控制台时出现了错误。这个错误仅仅发生在 Wildfly 控制台上,其他请求包括代理到 WebSocket 或 Wildfly 8080 端口的请求都成功完成。Wildfly 容器监听外部端口 9990,我可以通过此端口成功访问控制台。如果在 Docker 中映射端口 "9992:9990",我仍然可以通过端口 9992 成功访问控制台。因此,似乎这与 Docker 无关,而是与 Wildfly 控制台本身相关。可能是某种身份验证在使用反向代理时未能成功完成。请注意保留 HTML 标签。我有一个演示docker项目https://github.com/lucasbasquerotto/pod/tree/0.0.6,您可以下载标签0.0.6,其中已经设置好了与Wildfly 13和nginx的工作,并模拟此错误。
git clone -b 0.0.6 --single-branch --depth 1 https://github.com/lucasbasquerotto/pod.git
cd pod
docker-compose up -d
然后,如果您使用用户名monitor
和密码Monitor#70365
直接在http://localhost:9990
访问容器,一切正常。
但是,如果您使用相同的凭据通过nginx反向代理访问http://localhost:9991
,您将收到错误信息。
我的nginx.conf
文件:
upstream docker-wildfly {
server wildfly:9990;
}
location / {
proxy_pass http://docker-wildfly;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
我也尝试过以下方式:
proxy_set_header X-Forwarded-Proto $scheme;
同时,还需要使用授权头(Authorization header)(只需第二行和两者都需要):
proxy_set_header Authorization $http_authorization;
proxy_pass_header Authorization;
同时,还需要使用带有端口的主机头(而不仅仅是$host)进行定义:
proxy_set_header Host $server_addr:$server_port;
我已经尝试了上述的单独和组合配置,但都没有成功。
有什么建议吗?
有人成功通过反向代理访问Wildfly控制台吗?
更新(2018-09-22)
看起来Wildfly使用摘要认证(而不是基本认证)。
我在控制台中看到以下头部:
Authorization: Digest username="monitor", realm="ManagementRealm", nonce="AAAAAQAAAStPzpEGR3LxjJcd+HqIX2eJ+W8JuzRHejXPcGH++43AGWSVYTA=", uri="/console/index.html", algorithm=MD5, response="8d5b2b26adce452555d13598e77c0f63", opaque="00000000000000000000000000000000", qop=auth, nc=00000005, cnonce="fe0e31dd57f83948"
我没有看到关于使用nginx代理传递带有摘要头的请求的文档(但我认为它应该是透明的)。
这里在SO上看到一个问题是https://serverfault.com/questions/750213/http-digest-authentication-on-proxied-server,但目前还没有答案。
我看到有nginx非官方模块https://www.nginx.com/resources/wiki/modules/auth_digest/,但在github存储库(https://github.com/atomx/nginx-http-auth-digest)中说:
ngx_http_auth_digest模块补充了Nginx内置的基本身份验证模块,提供对RFC 2617摘要身份验证的支持。该模块目前可用,但仅经过作者测试和审核。鉴于这是安全代码,一个人的视线几乎肯定不足以保证它是100%正确的。在一些错误报告出现并且代码中的一些“未知的未知”被排除之前,请将此模块视为“Alpha”并适当地对待它。另外,在文件中硬编码用户和密码供nginx使用(在这种情况下,身份验证应对反向代理透明)似乎不太合适。
无论如何,我尝试了它,并且它正确地要求我进行身份验证,即使最终目标没有摘要身份验证,例如尝试连接到wildfly站点(而不是控制台),在尝试连接到nginx时(在代理请求之前),它会询问,然后成功转发到目标,除了wildfly控制台的情况,它会一直要求我进行身份验证。
因此,我认为这不是解决方案。问题似乎在于nginx传递给Wildfly Console的内容。
http_upgrade
或connection_upgrade
。无论如何,我对你详细的回答给予了+1的评价。 - Lucas Basquerotto