AJP 连接器配置了 SecretRequired="true",但升级到 2.2.5 后,secret 属性为 null 或 ""

问题描述 投票:0回答:5

原因: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 捆绑在一起。

spring-boot tomcat9 ajp
5个回答
63
投票

导航到 tomcat 中的

server.xml

AJP
替换为:

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

但请确保您了解其安全含义(请参阅 Krzysztof Skrzynecki 的答案)。


29
投票

使用

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

16
投票
这是一种解决方案,虽然可能不是最好的解决方案,但我的重点不是这个,只是为了通过错误,我在 Spring Boot 2.2.5.RELEASE 版本上启用 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; } }

应用程序.属性

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

2
投票
旧的,归档

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

0
投票
应该是:

重定向端口=“8443”/>

secretRequired =“假”/>

© www.soinside.com 2019 - 2024. All rights reserved.