原因:java.lang.IllegalArgumentException:AJP 连接器配置为 SecretRequired="true",但 Secret 属性为 null 或“”。该组合无效。
在 org.apache.coyote.ajp.AbstractAjpProtocol.start(AbstractAjpProtocol.java:264)
在 org.apache.catalina.connector.Connector.startInternal(Connector.java:1035) ... 省略了 22 个常见框架
将 Spring Boot 从 2.1.9 升级到 2.2.5 后,我看到上述错误。为了克服 Ghostcat 漏洞,必须进行升级,将 Tomcat 版本升级到 9.0.31,该版本与最新的 Spring Boot 2.2.5 捆绑在一起。
导航到 tomcat 中的
server.xml
:
将
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;
}
}
((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;
}
}
应用程序.属性
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">
重定向端口=“8443”/>
secretRequired =“假”/>