Springboot -AJP 连接器配置了 secretRequired="true" 但升级到 2.2.5 后,secret 属性为 null 或 ""

Man*_*ath 22 ajp spring-boot tomcat9

引起:java.lang.IllegalArgumentException:AJP 连接器配置为secretRequired="true",但secret 属性为空或""。此组合无效。在 org.apache.coyote.ajp.AbstractAjpProtocol.start(AbstractAjpProtocol.java:264) 在 org.apache.catalina.connector.Connector.startInternal(Connector.java:1035) ...省略了 22 个常用框架

将 springboot 从 2.1.9 升级到 2.2.5 后,我看到上述错误。通过将 tomcat 版本升级到与最新的 springboot 2.2.5 捆绑在一起的 9.0.31,升级是必要的,以克服 Ghostcat 漏洞。

小智 32

导航到server.xmlin tomcat :

替换AJP为:

<Connector protocol="AJP/1.3" address="::1" port="8009"
           redirectPort="8443" secretRequired="false" />
Run Code Online (Sandbox Code Playgroud)

但请确保您了解其安全含义(请参阅 Krzysztof Skrzynecki 对此的回答)。


Krz*_*cki 16

使用secretRequired="false"重新引入Ghostcat违反什么了说明,例如在这里

这是Tomcat/Undertow 中AJP 协议的配置问题。AJP 是一种高度可信的协议,永远不应该暴露给不受信任的客户端。它是不安全的(明文传输)并假设您的网络是安全的。应通过使用不允许暴露 AJP 的配置来采取预防措施。

按照优先顺序,应应用以下缓解措施之一:

  • ...
  • 使用 secret 保护 AJP 连接,并仔细检查网络绑定和防火墙配置,以确保仅允许来自受信任主机的传入连接。
  • ...

这里的安全配置应该是怎样的:

@Configuration
public class TomcatConfig {


  @Bean
  public TomcatServletWebServerFactory servletContainer() {
      TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
      Connector ajpConnector = new Connector("org.apache.coyote.ajp.AjpNioProtocol");
      AjpNioProtocol protocol= (AjpNioProtocol)ajpConnector.getProtocolHandler();
      protocol.setSecret("myapjsecret");
      ajpConnector.setPort(9090);
      ajpConnector.setSecure(true);
      tomcat.addAdditionalTomcatConnectors(ajpConnector);
      return tomcat;
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 正确的。据我了解,如果 AJP 连接器绑定到 0.0.0.0,这就是一个问题,而这在反向代理设置中是不必要的。如果 Apache HTTP 和 Tomcat 在同一主机上运行,​​最好将 Tomcat 显式绑定到 127.0.0.1。 (2认同)
  • 遵循所有步骤,仍然收到“403 服务器理解该请求,但拒绝授权”。连接器配置正确。在我的 Apache 虚拟主机上,我是否需要将秘密放在下面两行中,并明确 IP?ProxyPass / ajp://localhost:9009/ ProxyPassReverse / ajp://localhost.net:9009/ timeout=600 (2认同)

Tec*_*ree 9

这是一种解决方案,虽然可能不是最好的解决方案,但我的重点不是这个,只是为了解决错误,我在 Spring Boot 2.2.5.RELEASE 版本上启用了 AJP。添加这个:

((AbstractAjpProtocol) ajpConnector.getProtocolHandler()).setSecretRequired(false);
Run Code Online (Sandbox Code Playgroud)

我的 AJP 配置完整课程:

package com.ssldemo.config;

import org.apache.catalina.connector.Connector;
import org.apache.coyote.ajp.AbstractAjpProtocol;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class TomcatConfiguration {

    @Value("${tomcat.ajp.port}")
    int ajpPort;

    @Value("${tomcat.ajp.remoteauthentication}")
    String remoteAuthentication;

    @Value("${tomcat.ajp.enabled}")
    boolean tomcatAjpEnabled;

    @Bean
    public TomcatServletWebServerFactory servletContainer() {

        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        if (tomcatAjpEnabled) {
            Connector ajpConnector = new Connector("AJP/1.3");
            ajpConnector.setPort(ajpPort);
            ajpConnector.setSecure(false);
            ajpConnector.setAllowTrace(false);
            ajpConnector.setScheme("http");
            ((AbstractAjpProtocol) ajpConnector.getProtocolHandler()).setSecretRequired(false);
            tomcat.addAdditionalTomcatConnectors(ajpConnector);
        }

        return tomcat;
    }

}
Run Code Online (Sandbox Code Playgroud)

应用程序属性

server.port=8082
tomcat.ajp.port=9090
tomcat.ajp.remoteauthentication=false
tomcat.ajp.enabled=true
Run Code Online (Sandbox Code Playgroud)

  • 值得指出的是,上述配置重新引入了 Ghostcat 漏洞,该漏洞已通过默认将 AJP 连接器配置为 `secretRequired="true"` 来修复!可以找到安全配置,例如 https://access.redhat.com/solutions/4851251 (4认同)