【问题标题】:Spring Boot 2 - AJPSpring Boot 2 - AJP
【发布时间】:2018-08-22 20:02:17
【问题描述】:

我在我的 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;
    }

这很好用。我现在可以通过我的 apache 网络服务器访问我的 Spring Boot 应用程序。但是现在如果我运行我的 Spring Boot 应用程序,我将无法直接访问我的 Spring Boot 应用程序。所以这个网址不再起作用了

http://localhost:13080/online/showlogin?m=test

如果我禁用 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());
...

但这对我没有帮助。

【问题讨论】:

  • 不是创建TomcatServletWebServerFactory,而是创建一个WebServerFactoryCustomizer<TomcatServletWebServerFactory>,它添加了AJP的东西。这将在 Spring Boot 的默认配置之外执行。

标签: java spring spring-boot


【解决方案1】:

这对我有用:

    @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;
    }

【讨论】:

    【解决方案2】:

    我们成功使用了tomas answers的代码更长时间,但是在我们升级到Spring Boot版本> 2.2.4后它就停止了工作。我们在启动时收到此错误消息:

    应用程序启动失败

    说明:

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

    行动:

    验证连接器的配置,识别并停止正在侦听端口 1234 的任何进程,或将此应用程序配置为侦听另一个端口。

    但是端口没有被使用,那是什么问题?

    该问题是由 Spring Boot 2.2.5 中包含的 Tomcat 中 AJP 的 Ghostcat vulnerability 的修复引起的。

    现在你有两个选择,要么使用 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);
    
    

    或没有,但为此您必须将setSecretRequired 显式设置为false

    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);
    

    注意:后面的解决方案会让你的tomcat再次受到Ghostcat的攻击。

    有关更多信息,请查看此主题:Springboot -The AJP Connector is configured with secretRequired="true" but the secret attribute is either null or "" after upgrade to 2.2.5

    【讨论】:

      猜你喜欢
      • 2015-06-10
      • 1970-01-01
      • 2019-02-18
      • 2011-08-29
      • 2015-01-20
      • 2020-08-14
      • 2016-12-23
      • 2020-01-07
      • 2017-09-13
      相关资源
      最近更新 更多