Springboot -AJP Connector настроен с secretRequired = "true", но атрибут secret имеет значение null или "" после обновления до 2.2.5 - PullRequest
3 голосов
/ 03 марта 2020

Причина: java .lang.IllegalArgumentException: Соединитель AJP настроен с secretRequired = "true", но атрибут secret имеет значение null или "". Эта комбинация недействительна. в орг. apache .coyote.ajp.AbstractAjpProtocol.start (AbstractAjpProtocol. java: 264) в орг. apache .catalina.connector.Connector.startInternal (Соединитель. java: 1035) ... 22 общие кадры опущены

Я вижу вышеупомянутые ошибки после обновления подпружиненной загрузки с 2.1.9 до 2.2.5. Обновление было необходимо для преодоления уязвимости Ghostcat путем обновления версии Tomcat до 9.0.31, которая поставляется в комплекте с последней версией Springboot 2.2.5.

Ответы [ 3 ]

2 голосов
/ 07 апреля 2020

Перейдите к server.xml в коте:

Замените AJP на:

<Connector protocol="AJP/1.3" address="::1" port="8009"
           redirectPort="8443" secretRequired="false" />
2 голосов
/ 24 апреля 2020

Использование secretRequired="false" вновь приводит к нарушению Ghostcat, что было объяснено, например, здесь :

Это проблема конфигурации с протоколом AJP в Tomcat / Undertow. AJP - это протокол с высокой степенью доверия и никогда не должен подвергаться ненадежным клиентам. Это небезопасно (передача открытого текста) и предполагает, что ваша сеть безопасна. Профилактические меры должны быть приняты с использованием конфигурации, которая не позволяет выставлять AJP.

В порядке предпочтения, следует применить одно из следующих смягчений:

  • .. .
  • Защита соединения 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;
  }
}
1 голос
/ 03 марта 2020

Вот одно из решений, хотя, возможно, и не лучшее, но я сосредоточился не на этом, просто для того, чтобы пройти через ошибку, я включил AJP в Spring Boot 2.2.5.RELEASE версии. Добавьте это:

((AbstractAjpProtocol) ajpConnector.getProtocolHandler()).setSecretRequired(false);

Мой полный класс для конфигурации 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;
    }

}

application.properties

server.port=8082
tomcat.ajp.port=9090
tomcat.ajp.remoteauthentication=false
tomcat.ajp.enabled=true
...