programing

AJP 커넥터가 secretRequired="true"로 구성되어 있지만 2.2.5로 업그레이드한 후 비밀 속성이 null 또는 ""입니다.

cafebook 2023. 2. 22. 23:12
반응형

AJP 커넥터가 secretRequired="true"로 구성되어 있지만 2.2.5로 업그레이드한 후 비밀 속성이 null 또는 ""입니다.

원인: java.lang.부정 인수예외:AJP 커넥터는 secretRequired="true"로 구성되어 있지만 비밀 속성은 null 또는 ""입니다.이 조합은 유효하지 않습니다.org.disc.discote.ajp로 이동합니다.AbstractAjpProtocol.start(AbstractAjpProtocol).java:264)를 참조해 주세요.Connector.startInternal(Connector.java:1035)... 22개의 공통 프레임 생략

스프링 부트를 2.1.9에서 2.2.5로 업그레이드한 후 위의 오류가 발생하였습니다.최신 스프링 부트 2.2.5에 번들되어 있는 Tomcat 버전을 9.0.31로 업그레이드하여 Ghostcat 취약성을 극복하기 위해 업그레이드가 필요했습니다.

로 이동합니다.server.xmlTomcat:

교체하다AJP포함:

<Connector protocol="AJP/1.3" address="::1" port="8009"
           redirectPort="8443" secretRequired="false" />

단, 보안에 미치는 영향을 이해해야 합니다(Krzysztof Skrzynecki의 답변 참조).

사용.secretRequired="false"에서는 Ghostcat 침해에 대해 설명한 내용을 다시 소개합니다.다음은 예를 제시하겠습니다.

이것은 Tomcat/Undertow의 AJP 프로토콜 구성 문제입니다.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가지 해결책이 있습니다.최선은 아닐지도 모릅니다만, 제가 중점을 둔 것은 이것이 아닙니다.오류를 피하기 위해서 Spring Boot 2.2.5에서 AJP를 유효하게 하고 있었습니다.릴리즈 버전추가:

((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

이전 파일conf/server.xml

<Connector protocol="AJP/1.3" address="::1" port="8089" redirectPort="8443">

신규, 파일conf/server.xml

<Connector protocol="AJP/1.3" address="::1" port="8089" redirectPort="8443" secretRequired="false">

다음 항목이어야 합니다.

redirectPort="8443" />

secretRequired="false" />

언급URL : https://stackoverflow.com/questions/60501470/the-ajp-connector-is-configured-with-secretrequired-true-but-the-secret-attrib

반응형