Spring Boot 2 - AJP

tom*_*mas 2 java spring spring-boot

我为我的spring boot 2项目添加了一个AJP连接器

 @Bean
 public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new 
   TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(redirectConnector());

        return tomcat;
    }

    private Connector redirectConnector() {
        Connector connector = new Connector("AJP/1.3");
        connector.setScheme("http");
        connector.setPort(ajpPort);
        connector.setSecure(false);
        connector.setAllowTrace(false);
        return connector;
    }
Run Code Online (Sandbox Code Playgroud)

这很好用.我现在可以通过我的apache webserver访问我的spring启动应用程序了.但是现在,如果我运行我的春季启动应用程序,我无法直接访问我的春季启动应用程序.所以这个网址不再起作用了

HTTP://本地主机:13080 /在线/ showlogin米=测试

如果我禁用AJP连接器,URL将再次起作用.我尝试了以下内容

 private Connector redirectConnector2() {
    Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
    connector.setScheme("http");
    connector.setPort(13080);
    connector.setSecure(false);
    connector.setAllowTrace(false);
    return connector;
}
...
tomcat.addAdditionalTomcatConnectors(redirectConnector2());
...
Run Code Online (Sandbox Code Playgroud)

但这对我没有帮助.

tom*_*mas 10

这对我有用:

    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> servletContainer() {
      return server -> {
        if (server instanceof TomcatServletWebServerFactory) {
            ((TomcatServletWebServerFactory) server).addAdditionalTomcatConnectors(redirectConnector());
        }
      };
    }

    private Connector redirectConnector() {
       Connector connector = new Connector("AJP/1.3");
       connector.setScheme("http");
       connector.setPort(ajpPort);
       connector.setSecure(false);
       connector.setAllowTrace(false);
       return connector;
    }
Run Code Online (Sandbox Code Playgroud)


小智 7

我们成功地使用了托马斯答案的代码较长时间,但在我们升级到 Spring Boot 版本 > 2.2.4 后,它停止工作。我们在启动时收到此错误消息:

应用程序无法启动

描述:

配置为侦听端口 1234 的 Tomcat 连接器无法启动。该端口可能已在使用中,或者连接器可能配置错误。

行动:

验证连接器的配置,识别并停止正在侦听端口 1234 的任何进程,或配置此应用程序以侦听其他端口。

但是端口并没有被使用,那么问题出在哪里呢?

该问题是由Spring Boot 2.2.5 中修复 Tomcat 中 AJP 的Ghostcat 漏洞引起的。

现在你有两个选择,要么使用带有秘密的 AJP:

final Connector connector = new Connector("AJP/1.3");
connector.setScheme("http");
connector.setPort(ajpPort);
connector.setAllowTrace(false);

final AbstractAjpProtocol protocol = (AbstractAjpProtocol) connector.getProtocolHandler();
connector.setSecure(true);
protocol.setSecret(ajpSecret);

Run Code Online (Sandbox Code Playgroud)

或没有,但为此你必须明确设置setSecretRequiredfalse

final Connector connector = new Connector("AJP/1.3");
connector.setScheme("http");
connector.setPort(ajpPort);
connector.setAllowTrace(false);

final AbstractAjpProtocol protocol = (AbstractAjpProtocol) connector.getProtocolHandler();
connector.setSecure(false);
protocol.setSecretRequired(false);
Run Code Online (Sandbox Code Playgroud)

注意:后面的解决方案将使您的 tomcat 再次受到 Ghostcat 的攻击。

有关更多信息,请查看此线程:Springboot -AJP 连接器配置为 SecretRequired="true",但升级到 2.2.5 后,secret 属性为 null 或 ""