Question
For Spring Boot based application I have configurared ssl properties at application.properties, see my configuration here:
server.port=8443
server.ssl.key-alias=tomcat
server.ssl.key-password=123456
server.ssl.key-store=classpath:key.p12
server.ssl.key-store-provider=SunJSSE
server.ssl.key-store-type=pkcs12
And I have added conection at Application.class, like
@Bean
public EmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() {
final TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
factory.addAdditionalTomcatConnectors(this.createConnection());
return factory;
}
private Connector createConnection() {
final String protocol = "org.apache.coyote.http11.Http11NioProtocol";
final Connector connector = new Connector(protocol);
connector.setScheme("http");
connector.setPort(9090);
connector.setRedirectPort(8443);
return connector;
}
But when I try the following by
http://127.0.0.1:9090/
redirect to
https://127.0.0.1:8443/
is not performed. Who faced a similar problem?
Answer
For Tomcat to perform a redirect, you need to configure it with one or more
security constraints. You can do this by post-processing the Context
using a
TomcatEmbeddedServletContainerFactory
subclass.
For example:
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
Due to CONFIDENTIAL
and /*
, this will cause Tomcat to redirect every
request to HTTPS. You can configure multiple patterns and multiple constraints
if you need more control over what is and is not redirected.
An instance of the above TomcatEmbeddedServletContainerFactory
subclass
should be defined as a bean using a @Bean
method in a @Configuration
class.