Tomcat 8.5.32通过HTTP返回403的登录请求

时间:2018-08-14 19:03:39

标签: tomcat nginx cors

我对此感到有些困惑和困惑。 nginx用作反向代理和SSL终结器。我们的应用程序服务器在Tomcat 8.5.9上,并且一切正常。我们注意到,在将应用程序服务器升级到Tomcat 8.5.32后,从客户端通过https发送登录请求时,登录请求失败,403失败。似乎请求甚至没有达到我们的代码,而是由状态为403的tomcat返回。我什至在catalina.outlocalhost中都看不到任何日志条目。

研究了有关特定请求(包括授权数据的请求)的CORS和标头后,我发现如果我们从请求中删除Origin,请求就会通过。

供参考,请求看起来像这样...

Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8
Authorization: Basic anhjgFpbW9uLmhyg542VAa26hf5Fre76g==
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 49
Content-Type: application/json
Cookie: <cookie list>
Host: myserver.mydomain.com
Origin: https://myserver.mydomain.com
Pragma: no-cache
Referer: https://myserver.mydomain.com/client/index.html?param=value
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.32 Safari/537.36

服务器拒绝请求时响应标头。

Request URL: https://myserver.mydomain.com/api/login
Request Method: POST
Status Code: 403 
Remote Address: xxx.xxx.xx.xxx:443
Referrer Policy: no-referrer-when-downgrade
Connection: keep-alive
Content-Length: 0
Content-Type: text/plain
Date: Mon, 13 Aug 2018 06:16:43 GMT
Server: nginx/1.13.12

如果我们从请求中删除Origin,则登录请求将通过(tomcat响应200表示成功登录)。

赞赏一些建议,以便进一步调试此功能,因为我现在没有主意。为了清楚起见,如果我只是将tomcat降级到8.5.9(在反向代理或设置中没有其他更改),则登录将通过。如果请求是通过HTTP而不是https发送的,则登录也会通过。

更新(2018年8月18日):看来这是由8.5.32中的security fix引起的。当请求是使用Origin: *阻止请求时,此修复程序似乎正在阻止任何使用OriginCredentials: true的请求。

2 个答案:

答案 0 :(得分:0)

在对问题进行修正以注意CVE-2018-8014时,您已经发现行为的变化是由于ASF Bug 62343所致,而在Tomcat 8.5.32之前,其默认配置为以前的Tomcat可能会导致应用程序易受攻击。

尚不清楚的是导致您所描述的请求生成的要求-CORS的整个想法是启用跨域请求,其中Host和{{1} } HTTP请求标头字段将描述 distinct 的来源。但是在您的示例请求中-OriginHost似乎都发现了同一台主机Origin,这似乎没有多大意义。

听起来您可能想弄清楚为什么会发生这种情况-如果您使用的是同一个域,则不需要任何CORS,并且您的请求根本不应发现任何myserver.mydomain.com标头。哪种软件负责编写请求-您是否在集成测试中发送了手动编写的请求?然后就是您的测试有问题,这是必须修复的测试。

否则,您现在只需要为适当的CORS设置配置应用程序。 (之所以能在8.5.32之前运行,是因为默认设置不安全,因此这里没有任何神秘之处。)

作为临时修复/黑客的另一种选择是使用http://nginx.org/r/proxy_hide_header和/或http://nginx.org/r/proxy_set_header(您可以通过中介变量使用inside of an if)。

答案 1 :(得分:0)

更新server.xml中的主机名

您需要将name =“ localhost”更改为配置为与您的ngnix / apache服务器一起使用的domain的值。

<Host name="subdomain.domain.com"  appBase="webapps"
            unpackWARs="true" autoDeploy="true" deployXML="true">

我已经编写了完整的指南,以使用虚拟主机将反向代理添加到tomcat。

https://metamug.com/article/networking/lets-encrypt-ssl-on-tomcat.html