Spring boot + Undertow + 騰訊雲https證書配置SSL訪問專案( 多個專案使用SSL也可以,需要利用Nginx )
阿新 • • 發佈:2019-01-06
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使用的是不一樣的