spring-boottomcat9ajp

The AJP Connector is configured with secretRequired="true" but the secret attribute is either null or "" after upgrade to 2.2.5


Caused by: java.lang.IllegalArgumentException: The AJP Connector is configured with secretRequired="true" but the secret attribute is either null or "". This combination is not valid.
at org.apache.coyote.ajp.AbstractAjpProtocol.start(AbstractAjpProtocol.java:264)
at org.apache.catalina.connector.Connector.startInternal(Connector.java:1035) ... 22 common frames omitted

I am seeing the above errors after upgrading Spring Boot from 2.1.9 to 2.2.5. The upgrade was necessary to overcome a Ghostcat vulnerability by upgrading Tomcat version to 9.0.31, which is being bundled with the latest Spring Boot 2.2.5.


Solution

  • Here is one solution, though probably not the best one, but my focus was not this, just to pass through the error, I was enabling AJP on Spring Boot 2.2.5.RELEASE version. Add this:

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

    My full class for AJP configuration:

    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