【发布时间】:2019-02-26 09:07:05
【问题描述】:
我在登录Wildfly 13 Management Console 后收到错误Authentication required。
如果我输入了错误的用户名或密码,它会再次询问,但如果我输入正确,它会显示带有错误消息的页面(所以我假设用户名和密码是正确的,但之后的其他内容会给出错误)。
我正在使用 docker 来运行一个 nginx 容器和一个 wildfly 容器。
nginx在外部监听9991端口,proxy将请求传递给wildfly容器,但显示之前描述的错误。
Wildfly 控制台会发生这种情况,代理的所有其他请求,甚至代理到 websocket 或端口 8080 上的 Wildfly 的请求,都已成功完成。
Wildfly 容器在端口9990 上进行外部侦听,我可以在此端口成功访问控制台。如果在 docker 上我映射端口 "9992:9990" 我仍然可以通过端口 9992 成功访问控制台。
所以,这似乎与 docker 无关,而是与 Wildfly 控制台本身有关。在中间使用反向代理时,可能某种身份验证未成功进行。
我在https://github.com/lucasbasquerotto/pod/tree/0.0.6 上有一个演示 docker 项目,您可以下载标签 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 中访问容器一切正常。
但是如果您使用相同的凭据访问http://localhost:9991,通过 nginx 反向代理,您会收到错误。
我的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 标头(只是第 2 行,也有两者):
proxy_set_header Authorization $http_authorization;
proxy_pass_header Authorization;
并且还使用端口定义 host 标头(而不仅仅是 $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 代理带有摘要标头的传递请求的文档(但我认为它应该是透明的)。
我在这里看到的一个问题是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 的内置 Basic 通过提供对 RFC 2617 Digest 支持的身份验证模块 验证。该模块当前可用,但仅 由其作者测试和审查。鉴于这是安全性 代码,一套眼睛几乎可以肯定是不够保证的 它是 100% 正确的。直到出现一些错误报告和一些 代码中的“未知未知数”被清除,考虑一下 模块一个“alpha”并用适量的 怀疑。
在我看来,对用户进行硬编码并传入一个 nginx 使用的文件似乎也不好(在这种情况下,身份验证对反向代理应该是透明的)。
无论如何,我试过了,它正确地要求我进行身份验证,即使最终目的地没有摘要式身份验证,比如在尝试连接到 wildfly 站点(不是控制台)时,它也会在尝试连接时询问到nginx(在代理请求之前),然后成功转发到目的地,除了wildfly控制台,它一直要求我永远进行身份验证。
所以我认为这不是解决方案。问题似乎在于 nginx 传递给 Wildfly 控制台的内容。
【问题讨论】: