我在AWS EC2实例上的端口8080上运行Spring启动(Jhipster / Undertow)应用程序。
我将AWS ELB配置为重定向
80 -> 8080
443 (SSL termination happens here) -> 8080
该应用程序使用Spring Security,如果您的用户到达http://example.com,我希望它重定向到https://example.com,以使用SSL。
我在Tomcat中找到了各种配置示例,但没有使用Undertow。
我尝试了这个,第二个端口8089,它根据需要重定向,但这导致端口8080也重定向,我不想要。
80 -> 8089
443 (SSL termination happens here) -> 8080
@Bean
public EmbeddedServletContainerFactory undertow() {
UndertowEmbeddedServletContainerFactory undertow = new UndertowEmbeddedServletContainerFactory();
undertow.addBuilderCustomizers(builder -> builder.addHttpListener(8089, "0.0.0.0"));
undertow.addDeploymentInfoCustomizers(deploymentInfo -> {
deploymentInfo.addSecurityConstraint(new SecurityConstraint()
.addWebResourceCollection(new WebResourceCollection()
.addUrlPattern("/*"))
.setTransportGuaranteeType(TransportGuaranteeType.CONFIDENTIAL)
.setEmptyRoleSemantic(SecurityInfo.EmptyRoleSemantic.PERMIT))
.setConfidentialPortManager(exchange -> 443);
});
return undertow;
}
如何配置Undertow来实现这一目标?
答案 0 :(得分:1)
当我遇到同样的问题时,这对我有用:
从jhipster公开端口80(您可以在application-prod.yml
中更改它。)
当从http重定向到https时,Amazon ELB会添加一些标题,您应该在同一个文件中找到它们:
server:
use-forward-headers: true
port: 80
此外,您需要从jhipster强制执行https: https://jhipster.github.io/tips/007_tips_enforce_https.html
答案 1 :(得分:0)
以防万一,有人希望在Spring Boot 1.5.19中使用 HTTP / 2 将所有 http 请求重定向到 https 的有效解决方案,以下是application.properties
文件中的设置:
server.ssl.protocol=TLSv1.2
server.ssl.key-store-type=PKCS12
server.ssl.key-store=keystore.p12
server.ssl.key-store-password=xxxxxxx
server.port=443
server.use-forward-headers=true
以及以下Java配置:
import io.undertow.UndertowOptions;
import io.undertow.servlet.api.SecurityConstraint;
import io.undertow.servlet.api.SecurityInfo;
import io.undertow.servlet.api.TransportGuaranteeType;
import io.undertow.servlet.api.WebResourceCollection;
import org.springframework.boot.context.embedded.undertow.UndertowBuilderCustomizer;
import org.springframework.boot.context.embedded.undertow.UndertowEmbeddedServletContainerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
public class ConnectorConfig {
@Bean
public UndertowEmbeddedServletContainerFactory embeddedServletContainerFactory() {
UndertowEmbeddedServletContainerFactory factory = new UndertowEmbeddedServletContainerFactory();
factory.addBuilderCustomizers((UndertowBuilderCustomizer) builder -> {
builder.setServerOption(UndertowOptions.ENABLE_HTTP2, true);
builder.addHttpListener(80, "0.0.0.0");
});
factory.addDeploymentInfoCustomizers(deploymentInfo -> {
deploymentInfo.addSecurityConstraint(
new SecurityConstraint()
.addWebResourceCollection(new WebResourceCollection().addUrlPattern("/*"))
.setTransportGuaranteeType(TransportGuaranteeType.CONFIDENTIAL)
.setEmptyRoleSemantic(SecurityInfo.EmptyRoleSemantic.PERMIT))
.setConfidentialPortManager(exchange -> 443);
});
return factory;
}
}
一切都会正常进行。