1. 程式人生 > >Spring boot + Undertow + 騰訊雲https證書配置SSL訪問專案( 多個專案使用SSL也可以,需要利用Nginx )

Spring boot + Undertow + 騰訊雲https證書配置SSL訪問專案( 多個專案使用SSL也可以,需要利用Nginx )

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使用的是不一樣的