一文教你將 SpringBoot 網站升級爲 HTTPS

今年 2 月份,谷歌宣佈:7 月起,Chrome 瀏覽器的地址欄將把全部 HTTP 標示爲不安全網站!現在已是 6 月底了,是時候將拋棄容易被第三方監控的 HTTP 擁抱 HTTPS 了。web

下面就從 HTTPS 證書申請、網站 HTTPS 的配置、HTTP 重定向到 HTTPS 三個方面教你將一個 SpringBoot 網站升級爲安全的 HTTPS。spring

證書申請

目前國內提供免費 HTTPS 證書的雲服務商並很少,一貫不大方的騰訊此次卻是很大方,騰訊雲提供了免費的亞洲誠信品牌免費型 DV 版 SSL 證書,註冊認證過的用戶便可免費申請 20 個免費證書。apache

建立證書

選擇證書

首先你須要註冊認證騰訊雲,而後進入到 SSL證書 管理菜單,點擊申請證書按鈕,而後在彈框中選擇免費版DVSSL證書,點擊肯定按鈕。 編程

選擇證書

完善域名信息

而後填寫你的域名信息,通用名稱即爲你要申請證書的域名,申請郵箱填寫我的經常使用郵箱便可,以下圖所示: 瀏覽器

填寫域名信息

完成域名驗證

選擇DNS驗證後,會看到如下信息: tomcat

DNS驗證

此時進入到域名提供商的後臺,添加一條解析便可: 安全

添加TXT解析

最後回到證書驗證界面,點擊驗證便可認證成功,認證成功後坐等審覈經過便可,通常審覈時間爲幾分鐘到幾小時不等。bash

審覈完成後,就能夠在證書列表界面下載證書了,下載的到的文件是一個 ZIP 壓縮包,壓縮包裏面包含了各類經常使用的網站託管軟件所需的證書格式: 服務器

證書壓縮包內容

網站配置

拷貝密鑰

SpringBoot 默認使用 Tomcat 進行網站託管,所以從壓縮包中的 Tomcat 目錄將證書(文件後綴爲jks)拷貝到 SpringBoot 工程的 resources 目錄下便可: app

拷貝證書到 resources 目錄

更新配置

證書拷貝完整後,打開配置文件 application.yml,而後修改網站的端口爲 443key-store-password 能夠在證書壓縮包的 Tomcat 文件夾下的文本文件中找到,此外配置一下 SSL 證書的類型以及路徑等信息便可:

server:
  address: 0.0.0.0
  port: 443
  ssl:
    enabled: true
    key-store: classpath:luooqi.com.jks
    key-store-password: xxxxxxxxxxxx
    key-store-type: JKS
複製代碼

至此即可以啓動運行項目,能夠在地址欄輸入 https://yourdomain 便可訪問,在服務器上發佈後能夠看到以下效果:

認證發佈成功

將 HTTP 請求重定向到HTTPS

網站雖然升級到了 HTTPS,可是不少老用戶並不知情,當他們訪問舊版的 HTTP 地址時會發現網站已經沒法訪問:

舊版 HTTP 網址沒法正常訪問

所以最佳的作法是將 HTTP 重定向到 HTTPS,下面就教你如何經過代碼實現。

添加 HTTP 端口配置

首先在配置文件中添加自定義的 HTTP 端口配置:

http-port: 80
複製代碼

創建重定向關係

新建一個配置類 HttpsConfiguration,在類中將配置文件中自定義的 HTTP 端口和 HTTPS 的端口都注入進來,而後建立一個新的 Connector 來處理 HTTP 請求,同時設置 Connector 的端口爲注入的 HTTP 端口,重定向端口(setRedirectPort)爲新的 HTTPS 端口。

import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class HttpsConfiguration {
    @Value("${http-port}")
    private int port;

    @Value("${server.port}")
    private int sslPort;

    @Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            @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);
            }
        };
        tomcat.addAdditionalTomcatConnectors(redirectConnector());
        return tomcat;
    }

    private Connector redirectConnector() {
        Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
        connector.setScheme("http");
        connector.setPort(port);
        connector.setSecure(false);
        connector.setRedirectPort(sslPort);
        return connector;
    }
}
複製代碼

特別注意

上面代碼中須要特別注意的是,TomcatServletWebServerFactory 必需要在其 postProcessContext 方法中添加 HTTP 的匹配範圍 addPattern("/*"),不然重定向無效。


Any Code,Code Any!

掃碼關注『AnyCode』,編程路上,一塊兒前行。

相關文章
相關標籤/搜索