今年 2 月份,谷歌宣佈:7 月起,Chrome 瀏覽器的地址欄將把全部 HTTP 標示爲不安全網站!現在已是 6 月底了,是時候將拋棄容易被第三方監控的 HTTP 擁抱 HTTPS 了。web
下面就從 HTTPS 證書申請、網站 HTTPS 的配置、HTTP 重定向到 HTTPS 三個方面教你將一個 SpringBoot 網站升級爲安全的 HTTPS。spring
目前國內提供免費 HTTPS 證書的雲服務商並很少,一貫不大方的騰訊此次卻是很大方,騰訊雲提供了免費的亞洲誠信品牌免費型 DV 版 SSL 證書,註冊認證過的用戶便可免費申請 20 個免費證書。apache
首先你須要註冊認證騰訊雲,而後進入到 SSL證書
管理菜單,點擊申請證書
按鈕,而後在彈框中選擇免費版DVSSL證書
,點擊肯定
按鈕。 編程
而後填寫你的域名信息,通用名稱
即爲你要申請證書的域名,申請郵箱
填寫我的經常使用郵箱便可,以下圖所示: 瀏覽器
選擇DNS驗證後,會看到如下信息: tomcat
此時進入到域名提供商的後臺,添加一條解析便可: 安全
最後回到證書驗證界面,點擊驗證
便可認證成功,認證成功後坐等審覈經過便可,通常審覈時間爲幾分鐘到幾小時不等。bash
審覈完成後,就能夠在證書列表界面下載證書了,下載的到的文件是一個 ZIP 壓縮包,壓縮包裏面包含了各類經常使用的網站託管軟件所需的證書格式: 服務器
SpringBoot 默認使用 Tomcat 進行網站託管,所以從壓縮包中的 Tomcat 目錄將證書(文件後綴爲jks
)拷貝到 SpringBoot 工程的 resources
目錄下便可: app
證書拷貝完整後,打開配置文件 application.yml
,而後修改網站的端口爲 443
,key-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
便可訪問,在服務器上發佈後能夠看到以下效果:
網站雖然升級到了 HTTPS,可是不少老用戶並不知情,當他們訪問舊版的 HTTP 地址時會發現網站已經沒法訪問:
所以最佳的作法是將 HTTP 重定向到 HTTPS,下面就教你如何經過代碼實現。
首先在配置文件中添加自定義的 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』,編程路上,一塊兒前行。