tomcat9 shibboleth+mod_jk 身份验证被禁止

tomcat9 shibboleth+mod_jk 身份验证被禁止

我有一个 Spring Boot 应用程序当前在 Tomcat 8.5 下运行,该应用程序集成了基于 shibboleth 的 SSO。Shibboleth 和 tomcat 使用 apache2 mod_shib 和 mod_jk 连接,使用默认的 Debian 9 软件包。

我现在正尝试将应用程序的环境升级到 Debian 10(以及 tomcat 9),除了基于 Shibboleth 的身份验证之外,大多数事情都可以通过较小的配置更改来实现。

如果调用/login/shibboleth(在 apache 中配置为使用 shibboleth 进行身份验证,然后使用提供的 shibboleth 共享变量在应用程序内部登录),shibboleth SAML2 身份验证协议正确完成(并且可以在 apache 中查询 shibboleth 会话),但未调用处理程序方法/login/shibboleth(我使用远程调试检查了这一点),但被 tomcat 本身拒绝:

HTTP Status 403 – Forbidden
Type Status Report

Description The server understood the request but refuses to authorize it.

Apache Tomcat/9.0.31 (Debian)

我尝试研究这个问题,一个可能的解决方案似乎是在 AJP 连接器中使用一个密钥。定义一个密钥(在 tomcat9 的 server.xml 中)似乎不会改变任何行为(mod_jk 也是如此)似乎没有相应的选项,所以我想知道如何任何该功能在配置了秘密的情况下有效)。

有人有关于以下方面的想法吗:

  • 什么可能导致这个问题。
  • 可能的解决方案有哪些。

答案1

在 Tomcat 的最新版本中,AJP 连接器不再允许任何旧请求属性通过。默认通过的属性如下所述:https://tomcat.apache.org/tomcat-9.0-doc/config/ajp.html#Standard_Implementations

您可以通过暂时允许 AJP 连接器定义(可能在 server.xml 中找到)中的所有属性来测试这是否导致了 403 错误。

<Connector protocol="AJP/1.3" 
           port="8009" 
           secret="your_ajp_secret" 
           allowedRequestAttributesPattern=".*" />

如果可行,您可以将允许的属性限制为您实际需要的属性。具体情况因实施而异,但这对我来说很有效:allowedRequestAttributesPattern="^(Shib-.*|eppn)$”

如果您的问题确实与 AJP 机密有关,请注意 Apache 的 mod_proxy_ajp 直到最近才支持机密。不过,您会发现它在最新版本中有所记录。请参阅https://httpd.apache.org/docs/2.4/mod/mod_proxy_ajp.html

相关内容