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.xml
Tomcat:
교체하다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
'programing' 카테고리의 다른 글
구조체에 대한 JSON 문자열 구문 분석 방법 (0) | 2023.02.22 |
---|---|
pymongo.pymongo.pymongo.matCursorNotFound: 커서 ID '...'이(가) 서버에서 유효하지 않습니다. (0) | 2023.02.22 |
스프링 부트 2.1에서 Data Source bean 덮어쓰기 (0) | 2023.02.22 |
암호화된 워드프레스 관리자 암호를 해독하는 방법 (0) | 2023.02.22 |
반응 - "localStorage is not defined" 오류가 표시됨 (0) | 2023.02.22 |