tomcat的https配置和undertow差不多的,由于 spring boot + undertow + https的配置资料比较缺少,这里写一篇文章
1.单个主机上配置
- 先在pom.xml加入undertow容器依赖
<!--undertow web容器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
在腾讯云后台下载好免费的证书,下载后,在本地的解压目录找到tomcat包
其中kdystorePass.txt为证书密码在application.yml中设置SSL配置信息
server:
#web容器的SSL端口,不能删除
port: 443
#自定义声明http的端口,将在配置代码使用
http-port: 8070
ssl:
#指定证书的位置,把证书copy到/resource/config的目录下
key-store: classpath:config/youconfig.jks
#证书密钥,文件kdystorePass.txt的内容
key-password: 123456
- 在java代码配置undow
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.beans.factory.annotation.Value;
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
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;
@Configuration
public class UndertowConfig {
@Value("${server.http-port}")
private int httpPort;
@Value("${server.port}")
private int httpsPort;
@Bean
public EmbeddedServletContainerFactory servletContainer() {
UndertowEmbeddedServletContainerFactory undertowFactory = new UndertowEmbeddedServletContainerFactory();
//监听http端口
undertowFactory.addBuilderCustomizers((UndertowBuilderCustomizer) builder -> builder.addHttpListener(httpPort, "0.0.0.0"));
//将http的8070端口重定向到https的端口上
undertowFactory.addDeploymentInfoCustomizers(deploymentInfo -> {
deploymentInfo.addSecurityConstraint(new SecurityConstraint()
.addWebResourceCollection(new WebResourceCollection()
.addUrlPattern("/*")) .setTransportGuaranteeType(TransportGuaranteeType.CONFIDENTIAL)
.setEmptyRoleSemantic(SecurityInfo.EmptyRoleSemantic.PERMIT))
.setConfidentialPortManager(exchange -> httpsPort);
});
return undertowFactory;
}
}
最后启动项目访问即可。
2.若在同一主机上,结合Nginx对有两个(或多个)Spring boot + Undertow 项目配置SSL
由于443端口只有一个,这里需Nginx端口转发辅助
在服务器搞一个Nginx,并配置两个不同的子域名
A.host.com 、B.host.com
在腾讯云申请两个子域名的免费证书并下载,下载后,在本地的解压目录找到Nginx包
把A和B的证书文件都上传到服务器 路径为/usr/ssl/
- 基于案例1基础上,A和B先配置好项目的SSL证书(先测试启动是否正常),并对A、B项目配置不同的SSL端口
请针对A项目修改application.yml的配置server.port为8443(自定义)
请针对B项目修改application.yml的配置server.port为7443(自定义)
- Nginx配置如下
server {
listen 443 ssl;
server_name A.host.com;
ssl on;
# A项目的证书路径
ssl_certificate "/usr/ssl/A_bundle.crt";
ssl_certificate_key "/usr/ssl/A.key";
location / {
#对应项目修改的端口和域名
proxy_pass https://A.host.com:8443;
}
}
server {
listen 443 ssl;
server_name B.host.com;
ssl on;
# B项目的证书路径
ssl_certificate "/usr/ssl/B_bundle.crt";
ssl_certificate_key "/usr/ssl/B.key";
location / {
#对应项目修改的端口和域名
proxy_pass https://B.host.com:7443 ;
}
}
- 启动Nginx + A、B项目
注意:多个项目配置SSL,需要A,B项目内嵌容器配置SSL(指定Tomcat的版本证书),Nginx也需要配置SSL(指定Nginx的版本证书),项目使用的证书和Nginx使用的是不一样的